webrtc multiparty rust: Port to bindings 0.17 version
authorOlivier CrĂȘte <olivier.crete@collabora.com>
Tue, 9 Nov 2021 21:18:19 +0000 (15:18 -0600)
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Wed, 10 Nov 2021 16:13:38 +0000 (16:13 +0000)
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1332>

subprojects/gst-examples/webrtc/multiparty-sendrecv/gst-rust/Cargo.lock
subprojects/gst-examples/webrtc/multiparty-sendrecv/gst-rust/Cargo.toml
subprojects/gst-examples/webrtc/multiparty-sendrecv/gst-rust/src/main.rs

index 4e783a1..bf4051c 100644 (file)
@@ -1,5 +1,7 @@
 # This file is automatically @generated by Cargo.
 # It is not intended for manual editing.
+version = 3
+
 [[package]]
 name = "anyhow"
 version = "1.0.34"
@@ -211,6 +213,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "95752358c8f7552394baf48cd82695b345628ad3f170d607de3ca03b8dacca15"
 
 [[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"
 version = "0.1.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -476,32 +487,31 @@ dependencies = [
 
 [[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",
@@ -511,9 +521,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",
@@ -534,9 +544,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",
@@ -545,9 +555,9 @@ dependencies = [
 
 [[package]]
 name = "gstreamer"
-version = "0.16.5"
+version = "0.17.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5d50f822055923f1cbede233aa5dfd4ee957cf328fb3076e330886094e11d6cf"
+checksum = "c6a255f142048ba2c4a4dce39106db1965abe355d23f4b5335edea43a553faa4"
 dependencies = [
  "bitflags",
  "cfg-if 1.0.0",
@@ -555,11 +565,10 @@ dependencies = [
  "futures-core",
  "futures-util",
  "glib",
- "glib-sys",
- "gobject-sys",
  "gstreamer-sys",
  "libc",
  "muldiv",
+ "num-integer",
  "num-rational",
  "once_cell",
  "paste",
@@ -569,26 +578,22 @@ dependencies = [
 
 [[package]]
 name = "gstreamer-sdp"
-version = "0.16.5"
+version = "0.17.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "36832b09858102a4def30d2eb0d599043914ef83674609d578feb80a0e6bd3f2"
+checksum = "4fb915df42663a982c64d65c36e7de7963c96733ea591338c648cc124fc0b5c9"
 dependencies = [
  "glib",
- "glib-sys",
- "gobject-sys",
  "gstreamer",
  "gstreamer-sdp-sys",
- "gstreamer-sys",
 ]
 
 [[package]]
 name = "gstreamer-sdp-sys"
-version = "0.9.1"
+version = "0.17.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "405adf64f61c427c1c3cd6d928f0ca891bde2614b7bd31c3b3670ae0da3ac79a"
+checksum = "e37750f58494510976ac50e6c2ba1757e2270aca1086239bf02f576d63496201"
 dependencies = [
  "glib-sys",
- "gobject-sys",
  "gstreamer-sys",
  "libc",
  "system-deps",
@@ -596,9 +601,9 @@ dependencies = [
 
 [[package]]
 name = "gstreamer-sys"
-version = "0.9.1"
+version = "0.17.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fc1f154082d01af5718c5f8a8eb4f565a4ea5586ad8833a8fc2c2aa6844b601d"
+checksum = "a81704feeb3e8599913bdd1e738455c2991a01ff4a1780cb62200993e454cc3e"
 dependencies = [
  "glib-sys",
  "gobject-sys",
@@ -608,30 +613,25 @@ dependencies = [
 
 [[package]]
 name = "gstreamer-webrtc"
-version = "0.16.5"
+version = "0.17.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7b3077f2f250f493da8da786e8cfc160896963ec853219453748a88009768eeb"
+checksum = "12beabc4ac72936ec1e91502633771d163b322e4cb76dc51f203eb80ce1c2f05"
 dependencies = [
  "glib",
- "glib-sys",
- "gobject-sys",
  "gstreamer",
  "gstreamer-sdp",
- "gstreamer-sys",
  "gstreamer-webrtc-sys",
  "libc",
 ]
 
 [[package]]
 name = "gstreamer-webrtc-sys"
-version = "0.9.1"
+version = "0.17.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "67f294eea3e1421c524e3067364ea2c750159df9395c6c93324fb8cab089bffd"
+checksum = "96274f366e272fab68599907fc0f54ba91e8cd15ebdd6554ee5c7c10cd02d6ab"
 dependencies = [
  "glib-sys",
- "gobject-sys",
  "gstreamer-sdp-sys",
- "gstreamer-sys",
  "libc",
  "system-deps",
 ]
@@ -702,9 +702,9 @@ dependencies = [
 
 [[package]]
 name = "itertools"
-version = "0.9.0"
+version = "0.10.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b"
+checksum = "69ddb889f9d0d08a67338271fa9b62996bc788c7796a5c18cf057420aaed5eaf"
 dependencies = [
  "either",
 ]
@@ -768,9 +768,9 @@ checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525"
 
 [[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 = "native-tls"
@@ -812,9 +812,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",
@@ -968,10 +968,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",
 ]
 
@@ -1172,6 +1173,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8"
 
 [[package]]
+name = "smallvec"
+version = "1.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1ecab6c735a6bb4139c0caafd0cc3635748bbb3acf4550e8138122099251f309"
+
+[[package]]
 name = "structopt"
 version = "0.3.20"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1197,15 +1204,15 @@ dependencies = [
 
 [[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",
@@ -1226,11 +1233,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",
@@ -1264,18 +1274,18 @@ dependencies = [
 
 [[package]]
 name = "thiserror"
-version = "1.0.22"
+version = "1.0.30"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0e9ae34b84616eedaaf1e9dd6026dbe00dcafa92aa0c8077cb69df1fcfe5e53e"
+checksum = "854babe52e4df1653706b98fcfc05843010039b406875930a70e4d9644e5c417"
 dependencies = [
  "thiserror-impl",
 ]
 
 [[package]]
 name = "thiserror-impl"
-version = "1.0.22"
+version = "1.0.30"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9ba20f23e85b10754cd195504aebf6a27e2e6cbe28c17778a0c930724628dd56"
+checksum = "aa32fd3f627f367fe16f893e2597ae3c05020f8bba2666a4e6ea73d377e5714b"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -1399,9 +1409,9 @@ checksum = "eafc1b9b2dfc6f5529177b62cf806484db55b32dc7c9658a118e11bbeb33061d"
 
 [[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"
index eeeb282..79f7d76 100644 (file)
@@ -11,9 +11,9 @@ structopt = { version = "0.3", default-features = false }
 anyhow = "1"
 rand = "0.7"
 async-tungstenite = { version = "0.10", features = ["async-std-runtime", "async-native-tls"] }
-gst = { package = "gstreamer", version = "0.16", features = ["v1_14"] }
-gst-webrtc = { package = "gstreamer-webrtc", version = "0.16" }
-gst-sdp = { package = "gstreamer-sdp", version = "0.16", features = ["v1_14"] }
+gst = { package = "gstreamer", version = "0.17", features = ["v1_14", "v1_20"] }
+gst-webrtc = { package = "gstreamer-webrtc", version = "0.17" }
+gst-sdp = { package = "gstreamer-sdp", version = "0.17", features = ["v1_14"] }
 serde = "1"
 serde_derive = "1"
 serde_json = "1"
index 214a7d0..5963d16 100644 (file)
@@ -19,7 +19,6 @@ use async_tungstenite::tungstenite;
 use tungstenite::Error as WsError;
 use tungstenite::Message as WsMessage;
 
-use gst::gst_element_error;
 use gst::prelude::*;
 
 use serde_derive::{Deserialize, Serialize};
@@ -178,21 +177,21 @@ impl App {
 
         // Get access to the tees and mixers by name
         let video_tee = pipeline
-            .get_by_name("video-tee")
+            .by_name("video-tee")
             .expect("can't find video-tee");
         let audio_tee = pipeline
-            .get_by_name("audio-tee")
+            .by_name("audio-tee")
             .expect("can't find audio-tee");
 
         let video_mixer = pipeline
-            .get_by_name("video-mixer")
+            .by_name("video-mixer")
             .expect("can't find video-mixer");
         let audio_mixer = pipeline
-            .get_by_name("audio-mixer")
+            .by_name("audio-mixer")
             .expect("can't find audio-mixer");
 
         // Create a stream for handling the GStreamer message asynchronously
-        let bus = pipeline.get_bus().unwrap();
+        let bus = pipeline.bus().unwrap();
         let send_gst_msg_rx = bus.stream();
 
         // Channel for outgoing WebSocket messages from other threads
@@ -224,7 +223,7 @@ impl App {
         app.pipeline.call_async(|pipeline| {
             // If this fails, post an error on the bus so we exit
             if pipeline.set_state(gst::State::Playing).is_err() {
-                gst_element_error!(
+                gst::element_error!(
                     pipeline,
                     gst::LibraryError::Failed,
                     ("Failed to set pipeline to Playing")
@@ -293,14 +292,14 @@ impl App {
         match message.view() {
             MessageView::Error(err) => bail!(
                 "Error from element {}: {} ({})",
-                err.get_src()
-                    .map(|s| String::from(s.get_path_string()))
+                err.src()
+                    .map(|s| String::from(s.path_string()))
                     .unwrap_or_else(|| String::from("None")),
-                err.get_error(),
-                err.get_debug().unwrap_or_else(|| String::from("None")),
+                err.error(),
+                err.debug().unwrap_or_else(|| String::from("None")),
             ),
             MessageView::Warning(warning) => {
-                println!("Warning: \"{}\"", warning.get_debug().unwrap());
+                println!("Warning: \"{}\"", warning.debug().unwrap());
             }
             _ => (),
         }
@@ -326,7 +325,7 @@ impl App {
 
         // Get access to the webrtcbin by name
         let webrtcbin = peer_bin
-            .get_by_name("webrtcbin")
+            .by_name("webrtcbin")
             .expect("can't find webrtcbin");
 
         // Set some properties on webrtcbin
@@ -336,21 +335,21 @@ impl App {
 
         // Add ghost pads for connecting to the input
         let audio_queue = peer_bin
-            .get_by_name("audio-queue")
+            .by_name("audio-queue")
             .expect("can't find audio-queue");
         let audio_sink_pad = gst::GhostPad::with_target(
             Some("audio_sink"),
-            &audio_queue.get_static_pad("sink").unwrap(),
+            &audio_queue.static_pad("sink").unwrap(),
         )
         .unwrap();
         peer_bin.add_pad(&audio_sink_pad).unwrap();
 
         let video_queue = peer_bin
-            .get_by_name("video-queue")
+            .by_name("video-queue")
             .expect("can't find video-queue");
         let video_sink_pad = gst::GhostPad::with_target(
             Some("video_sink"),
-            &video_queue.get_static_pad("sink").unwrap(),
+            &video_queue.static_pad("sink").unwrap(),
         )
         .unwrap();
         peer_bin.add_pad(&video_sink_pad).unwrap();
@@ -362,7 +361,7 @@ impl App {
             send_msg_tx: self.send_msg_tx.clone(),
         }));
 
-        // Insert the peer into our map
+        // Insert the peer into our map_
         peers.insert(peer_id, peer.clone());
         drop(peers);
 
@@ -379,7 +378,7 @@ impl App {
 
                     let peer = upgrade_weak!(peer_clone, None);
                     if let Err(err) = peer.on_negotiation_needed() {
-                        gst_element_error!(
+                        gst::element_error!(
                             peer.bin,
                             gst::LibraryError::Failed,
                             ("Failed to negotiate: {:?}", err)
@@ -396,16 +395,15 @@ impl App {
         peer.webrtcbin
             .connect("on-ice-candidate", false, move |values| {
                 let _webrtc = values[0].get::<gst::Element>().expect("Invalid argument");
-                let mlineindex = values[1].get_some::<u32>().expect("Invalid argument");
+                let mlineindex = values[1].get::<u32>().expect("Invalid argument");
                 let candidate = values[2]
                     .get::<String>()
-                    .expect("Invalid argument")
-                    .unwrap();
+                    .expect("Invalid argument");
 
                 let peer = upgrade_weak!(peer_clone, None);
 
                 if let Err(err) = peer.on_ice_candidate(mlineindex, candidate) {
-                    gst_element_error!(
+                    gst::element_error!(
                         peer.bin,
                         gst::LibraryError::Failed,
                         ("Failed to send ICE candidate: {:?}", err)
@@ -422,7 +420,7 @@ impl App {
             let peer = upgrade_weak!(peer_clone);
 
             if let Err(err) = peer.on_incoming_stream(pad) {
-                gst_element_error!(
+                gst::element_error!(
                     peer.bin,
                     gst::LibraryError::Failed,
                     ("Failed to handle incoming stream: {:?}", err)
@@ -435,20 +433,20 @@ impl App {
         peer.bin.connect_pad_added(move |_bin, pad| {
             let app = upgrade_weak!(app_clone);
 
-            if pad.get_name() == "audio_src" {
-                let audiomixer_sink_pad = app.audio_mixer.get_request_pad("sink_%u").unwrap();
+            if pad.name() == "audio_src" {
+                let audiomixer_sink_pad = app.audio_mixer.request_pad_simple("sink_%u").unwrap();
                 pad.link(&audiomixer_sink_pad).unwrap();
 
                 // Once it is unlinked again later when the peer is being removed,
                 // also release the pad on the mixer
                 audiomixer_sink_pad.connect_unlinked(move |pad, _peer| {
-                    if let Some(audiomixer) = pad.get_parent() {
+                    if let Some(audiomixer) = pad.parent() {
                         let audiomixer = audiomixer.downcast_ref::<gst::Element>().unwrap();
                         audiomixer.release_request_pad(pad);
                     }
                 });
-            } else if pad.get_name() == "video_src" {
-                let videomixer_sink_pad = app.video_mixer.get_request_pad("sink_%u").unwrap();
+            } else if pad.name() == "video_src" {
+                let videomixer_sink_pad = app.video_mixer.request_pad_simple("sink_%u").unwrap();
                 pad.link(&videomixer_sink_pad).unwrap();
 
                 app.relayout_videomixer();
@@ -459,7 +457,7 @@ impl App {
                 videomixer_sink_pad.connect_unlinked(move |pad, _peer| {
                     let app = upgrade_weak!(app_clone);
 
-                    if let Some(videomixer) = pad.get_parent() {
+                    if let Some(videomixer) = pad.parent() {
                         let videomixer = videomixer.downcast_ref::<gst::Element>().unwrap();
                         videomixer.release_request_pad(pad);
                     }
@@ -477,7 +475,7 @@ impl App {
         //
         // Otherwise it might happen that data is received before
         // the elements are ready and then an error happens.
-        let audio_src_pad = self.audio_tee.get_request_pad("src_%u").unwrap();
+        let audio_src_pad = self.audio_tee.request_pad_simple("src_%u").unwrap();
         let audio_block = audio_src_pad
             .add_probe(gst::PadProbeType::BLOCK_DOWNSTREAM, |_pad, _info| {
                 gst::PadProbeReturn::Ok
@@ -485,7 +483,7 @@ impl App {
             .unwrap();
         audio_src_pad.link(&audio_sink_pad)?;
 
-        let video_src_pad = self.video_tee.get_request_pad("src_%u").unwrap();
+        let video_src_pad = self.video_tee.request_pad_simple("src_%u").unwrap();
         let video_block = video_src_pad
             .add_probe(gst::PadProbeType::BLOCK_DOWNSTREAM, |_pad, _info| {
                 gst::PadProbeReturn::Ok
@@ -497,7 +495,7 @@ impl App {
         peer.bin.call_async(move |bin| {
             // If this fails, post an error on the bus so we exit
             if bin.sync_state_with_parent().is_err() {
-                gst_element_error!(
+                gst::element_error!(
                     bin,
                     gst::LibraryError::Failed,
                     ("Failed to set peer bin to Playing")
@@ -526,14 +524,14 @@ impl App {
                 let app = upgrade_weak!(app_clone);
 
                 // Block the tees shortly for removal
-                let audio_tee_sinkpad = app.audio_tee.get_static_pad("sink").unwrap();
+                let audio_tee_sinkpad = app.audio_tee.static_pad("sink").unwrap();
                 let audio_block = audio_tee_sinkpad
                     .add_probe(gst::PadProbeType::BLOCK_DOWNSTREAM, |_pad, _info| {
                         gst::PadProbeReturn::Ok
                     })
                     .unwrap();
 
-                let video_tee_sinkpad = app.video_tee.get_static_pad("sink").unwrap();
+                let video_tee_sinkpad = app.video_tee.static_pad("sink").unwrap();
                 let video_block = video_tee_sinkpad
                     .add_probe(gst::PadProbeType::BLOCK_DOWNSTREAM, |_pad, _info| {
                         gst::PadProbeReturn::Ok
@@ -541,16 +539,16 @@ impl App {
                     .unwrap();
 
                 // Release the tee pads and unblock
-                let audio_sinkpad = peer.bin.get_static_pad("audio_sink").unwrap();
-                let video_sinkpad = peer.bin.get_static_pad("video_sink").unwrap();
+                let audio_sinkpad = peer.bin.static_pad("audio_sink").unwrap();
+                let video_sinkpad = peer.bin.static_pad("video_sink").unwrap();
 
-                if let Some(audio_tee_srcpad) = audio_sinkpad.get_peer() {
+                if let Some(audio_tee_srcpad) = audio_sinkpad.peer() {
                     let _ = audio_tee_srcpad.unlink(&audio_sinkpad);
                     app.audio_tee.release_request_pad(&audio_tee_srcpad);
                 }
                 audio_tee_sinkpad.remove_probe(audio_block);
 
-                if let Some(video_tee_srcpad) = video_sinkpad.get_peer() {
+                if let Some(video_tee_srcpad) = video_sinkpad.peer() {
                     let _ = video_tee_srcpad.unlink(&video_sinkpad);
                     app.video_tee.release_request_pad(&video_tee_srcpad);
                 }
@@ -568,7 +566,7 @@ impl App {
     }
 
     fn relayout_videomixer(&self) {
-        let mut pads = self.video_mixer.get_sink_pads();
+        let mut pads = self.video_mixer.sink_pads();
         if pads.is_empty() {
             return;
         }
@@ -633,7 +631,7 @@ impl Peer {
             let peer = upgrade_weak!(peer_clone);
 
             if let Err(err) = peer.on_offer_created(reply) {
-                gst_element_error!(
+                gst::element_error!(
                     peer.bin,
                     gst::LibraryError::Failed,
                     ("Failed to send SDP offer: {:?}", err)
@@ -642,7 +640,7 @@ impl Peer {
         });
 
         self.webrtcbin
-            .emit("create-offer", &[&None::<gst::Structure>, &promise])
+            .emit_by_name("create-offer", &[&None::<gst::Structure>, &promise])
             .unwrap();
 
         Ok(())
@@ -665,23 +663,22 @@ impl Peer {
         };
 
         let offer = reply
-            .get_value("offer")
+            .value("offer")
             .unwrap()
             .get::<gst_webrtc::WebRTCSessionDescription>()
-            .expect("Invalid argument")
-            .unwrap();
+            .expect("Invalid argument");
         self.webrtcbin
-            .emit("set-local-description", &[&offer, &None::<gst::Promise>])
+            .emit_by_name("set-local-description", &[&offer, &None::<gst::Promise>])
             .unwrap();
 
         println!(
             "sending SDP offer to peer: {}",
-            offer.get_sdp().as_text().unwrap()
+            offer.sdp().as_text().unwrap()
         );
 
         let message = serde_json::to_string(&JsonMsg::Sdp {
             type_: "offer".to_string(),
-            sdp: offer.get_sdp().as_text().unwrap(),
+            sdp: offer.sdp().as_text().unwrap(),
         })
         .unwrap();
 
@@ -714,23 +711,22 @@ impl Peer {
         };
 
         let answer = reply
-            .get_value("answer")
+            .value("answer")
             .unwrap()
             .get::<gst_webrtc::WebRTCSessionDescription>()
-            .expect("Invalid argument")
-            .unwrap();
+            .expect("Invalid argument");
         self.webrtcbin
-            .emit("set-local-description", &[&answer, &None::<gst::Promise>])
+            .emit_by_name("set-local-description", &[&answer, &None::<gst::Promise>])
             .unwrap();
 
         println!(
             "sending SDP answer to peer: {}",
-            answer.get_sdp().as_text().unwrap()
+            answer.sdp().as_text().unwrap()
         );
 
         let message = serde_json::to_string(&JsonMsg::Sdp {
             type_: "answer".to_string(),
-            sdp: answer.get_sdp().as_text().unwrap(),
+            sdp: answer.sdp().as_text().unwrap(),
         })
         .unwrap();
 
@@ -757,7 +753,7 @@ impl Peer {
                 gst_webrtc::WebRTCSessionDescription::new(gst_webrtc::WebRTCSDPType::Answer, ret);
 
             self.webrtcbin
-                .emit("set-remote-description", &[&answer, &None::<gst::Promise>])
+                .emit_by_name("set-remote-description", &[&answer, &None::<gst::Promise>])
                 .unwrap();
 
             Ok(())
@@ -780,7 +776,7 @@ impl Peer {
 
                 peer.0
                     .webrtcbin
-                    .emit("set-remote-description", &[&offer, &None::<gst::Promise>])
+                    .emit_by_name("set-remote-description", &[&offer, &None::<gst::Promise>])
                     .unwrap();
 
                 let peer_clone = peer.downgrade();
@@ -788,7 +784,7 @@ impl Peer {
                     let peer = upgrade_weak!(peer_clone);
 
                     if let Err(err) = peer.on_answer_created(reply) {
-                        gst_element_error!(
+                        gst::element_error!(
                             peer.bin,
                             gst::LibraryError::Failed,
                             ("Failed to send SDP answer: {:?}", err)
@@ -798,7 +794,7 @@ impl Peer {
 
                 peer.0
                     .webrtcbin
-                    .emit("create-answer", &[&None::<gst::Structure>, &promise])
+                    .emit_by_name("create-answer", &[&None::<gst::Structure>, &promise])
                     .unwrap();
             });
 
@@ -811,7 +807,7 @@ impl Peer {
     // Handle incoming ICE candidates from the peer by passing them to webrtcbin
     fn handle_ice(&self, sdp_mline_index: u32, candidate: &str) -> Result<(), anyhow::Error> {
         self.webrtcbin
-            .emit("add-ice-candidate", &[&sdp_mline_index, &candidate])
+            .emit_by_name("add-ice-candidate", &[&sdp_mline_index, &candidate])
             .unwrap();
 
         Ok(())
@@ -842,14 +838,14 @@ impl Peer {
     // and audio/video sink depending on the stream type
     fn on_incoming_stream(&self, pad: &gst::Pad) -> Result<(), anyhow::Error> {
         // Early return for the source pads we're adding ourselves
-        if pad.get_direction() != gst::PadDirection::Src {
+        if pad.direction() != gst::PadDirection::Src {
             return Ok(());
         }
 
-        let caps = pad.get_current_caps().unwrap();
-        let s = caps.get_structure(0).unwrap();
+        let caps = pad.current_caps().unwrap();
+        let s = caps.structure(0).unwrap();
         let media_type = s
-            .get::<&str>("media")
+            .get_optional::<&str>("media")
             .expect("Invalid type")
             .ok_or_else(|| anyhow!("no media type in caps {:?}", caps))?;
 
@@ -873,16 +869,16 @@ impl Peer {
         };
 
         // Add a ghost pad on our conv bin that proxies the sink pad of the decodebin
-        let dbin = conv.get_by_name("dbin").unwrap();
+        let dbin = conv.by_name("dbin").unwrap();
         let sinkpad =
-            gst::GhostPad::with_target(Some("sink"), &dbin.get_static_pad("sink").unwrap())
+            gst::GhostPad::with_target(Some("sink"), &dbin.static_pad("sink").unwrap())
                 .unwrap();
         conv.add_pad(&sinkpad).unwrap();
 
         // And another one that proxies the source pad of the last element
-        let src = conv.get_by_name("src").unwrap();
+        let src = conv.by_name("src").unwrap();
         let srcpad =
-            gst::GhostPad::with_target(Some("src"), &src.get_static_pad("src").unwrap()).unwrap();
+            gst::GhostPad::with_target(Some("src"), &src.static_pad("src").unwrap()).unwrap();
         conv.add_pad(&srcpad).unwrap();
 
         self.bin.add(&conv).unwrap();