Skip to content

Commit

Permalink
Update gstreamer to 0.22 (#417)
Browse files Browse the repository at this point in the history
* Update gstreamer to 0.22

* changes for sdroege/gstreamer-rs@4957921

* glib

* more gstreamer changes

* Apply suggestions from code review

Co-authored-by: Sebastian Dröge <sebastian@centricular.com>

---------

Co-authored-by: Sebastian Dröge <sebastian@centricular.com>
  • Loading branch information
sagudev and sdroege committed Mar 1, 2024
1 parent 3a996d6 commit c04bb30
Show file tree
Hide file tree
Showing 12 changed files with 205 additions and 178 deletions.
285 changes: 153 additions & 132 deletions Cargo.lock

Large diffs are not rendered by default.

35 changes: 18 additions & 17 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -13,28 +13,29 @@ members = [
"servo-media",
"servo-media-derive",
"streams",
"webrtc"
"webrtc",
]

[workspace.dependencies]
glib = "0.18"
glib-sys = "0.18"
gst = { package = "gstreamer", version = "0.21" }
gst-app = { package = "gstreamer-app", version = "0.21" }
gst-audio = { package = "gstreamer-audio", version = "0.21" }
gst-base = { package = "gstreamer-base", version = "0.21" }
gst-gl = { package = "gstreamer-gl", version = "0.21" }
gst-player = { package = "gstreamer-player", version = "0.21" }
gst-sdp = { package = "gstreamer-sdp", version = "0.21" }
gst-video = { package = "gstreamer-video", version = "0.21" }
gst-webrtc = { package = "gstreamer-webrtc", version = "0.21", features = ["v1_18"] }
gstreamer-gl-egl = { version = "0.21" }
gstreamer-gl-wayland = { version = "0.21" }
gstreamer-gl-x11 = { version = "0.21" }
gstreamer-sys = "0.21"
glib = "0.19"
glib-sys = "0.19"
gst = { package = "gstreamer", version = "0.22" }
gst-app = { package = "gstreamer-app", version = "0.22" }
gst-audio = { package = "gstreamer-audio", version = "0.22" }
gst-base = { package = "gstreamer-base", version = "0.22" }
gst-gl = { package = "gstreamer-gl", version = "0.22" }
gst-player = { package = "gstreamer-player", version = "0.22" }
gst-sdp = { package = "gstreamer-sdp", version = "0.22" }
gst-video = { package = "gstreamer-video", version = "0.22" }
gst-webrtc = { package = "gstreamer-webrtc", version = "0.22", features = [
"v1_18",
] }
gstreamer-gl-egl = { version = "0.22" }
gstreamer-gl-wayland = { version = "0.22" }
gstreamer-gl-x11 = { version = "0.22" }
gstreamer-sys = "0.22"
ipc-channel = "0.18"

[patch."https://github.com/servo/webrender"]
webrender = { git = "https://github.com/jdm/webrender", branch = "crash-backtrace" }
webrender_api = { git = "https://github.com/jdm/webrender", branch = "crash-backtrace" }

9 changes: 6 additions & 3 deletions backends/gstreamer/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ path = "lib.rs"

[dependencies]
byte-slice-cast = "0.2"
glib = "0.18"
glib-sys = "0.18"
glib = { workspace = true }
glib-sys = { workspace = true }
gst = { workspace = true }
gst-app = { workspace = true }
gst-audio = { workspace = true }
Expand All @@ -37,7 +37,10 @@ servo-media-webrtc = { path = "../../webrtc" }
url = "2.0"

[target.'cfg(any(target_os = "linux", target_os = "dragonfly", target_os = "freebsd", target_os = "netbsd", target_os = "openbsd"))'.dependencies]
servo-media-gstreamer-render-unix = { path = "render-unix", features = ["gl-egl", "gl-x11"] }
servo-media-gstreamer-render-unix = { path = "render-unix", features = [
"gl-egl",
"gl-x11",
] }

[target.'cfg(target_os = "android")'.dependencies]
servo-media-gstreamer-render-android = { path = "render-android" }
2 changes: 1 addition & 1 deletion backends/gstreamer/datachannel.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use glib::{ObjectExt, ToSendValue};
use glib::prelude::*;
use gst_webrtc::{WebRTCDataChannel, WebRTCDataChannelState};
use servo_media_webrtc::thread::InternalEvent;
use servo_media_webrtc::WebRtcController as WebRtcThread;
Expand Down
3 changes: 1 addition & 2 deletions backends/gstreamer/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,12 @@ mod source;
pub mod webrtc;

use device_monitor::GStreamerDeviceMonitor;
use glib::once_cell::sync::Lazy;
use gst::prelude::*;
use ipc_channel::ipc::IpcSender;
use log::warn;
use media_stream::GStreamerMediaStream;
use mime::Mime;
use once_cell::sync::OnceCell;
use once_cell::sync::{Lazy, OnceCell};
use registry_scanner::GSTREAMER_REGISTRY_SCANNER;
use servo_media::{Backend, BackendInit, SupportsMediaType};
use servo_media_audio::context::{AudioContext, AudioContextOptions};
Expand Down
2 changes: 1 addition & 1 deletion backends/gstreamer/media_stream.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use super::BACKEND_BASE_TIME;
use glib::once_cell::sync::Lazy;
use gst;
use gst::prelude::*;
use once_cell::sync::Lazy;
use servo_media_streams::registry::{
get_stream, register_stream, unregister_stream, MediaStreamId,
};
Expand Down
4 changes: 2 additions & 2 deletions backends/gstreamer/media_stream_source.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
use crate::media_stream::{GStreamerMediaStream, RTP_CAPS_OPUS, RTP_CAPS_VP8};
use glib::once_cell::sync::Lazy;
use glib::subclass::prelude::*;
use gst::prelude::*;
use gst::subclass::prelude::*;
use gst_base::UniqueFlowCombiner;
use once_cell::sync::Lazy;
use servo_media_streams::{MediaStream, MediaStreamType};
use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::{Arc, Mutex};
Expand Down Expand Up @@ -317,7 +317,7 @@ pub fn register_servo_media_stream_src() -> Result<(), glib::BoolError> {
gst::Element::register(
None,
"servomediastreamsrc",
gst::Rank::None,
gst::Rank::NONE,
ServoMediaStreamSrc::static_type(),
)
}
12 changes: 6 additions & 6 deletions backends/gstreamer/registry_scanner.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use glib::once_cell::sync::Lazy;
use once_cell::sync::Lazy;
use std::collections::HashSet;
use std::str::FromStr;

Expand Down Expand Up @@ -38,23 +38,23 @@ impl GStreamerRegistryScanner {
fn initialize(&mut self) {
let audio_decoder_factories = gst::ElementFactory::factories_with_type(
gst::ElementFactoryType::DECODER | gst::ElementFactoryType::MEDIA_AUDIO,
gst::Rank::Marginal,
gst::Rank::MARGINAL,
);
let audio_parser_factories = gst::ElementFactory::factories_with_type(
gst::ElementFactoryType::PARSER | gst::ElementFactoryType::MEDIA_AUDIO,
gst::Rank::None,
gst::Rank::NONE,
);
let video_decoder_factories = gst::ElementFactory::factories_with_type(
gst::ElementFactoryType::DECODER | gst::ElementFactoryType::MEDIA_VIDEO,
gst::Rank::Marginal,
gst::Rank::MARGINAL,
);
let video_parser_factories = gst::ElementFactory::factories_with_type(
gst::ElementFactoryType::PARSER | gst::ElementFactoryType::MEDIA_VIDEO,
gst::Rank::Marginal,
gst::Rank::MARGINAL,
);
let demux_factories = gst::ElementFactory::factories_with_type(
gst::ElementFactoryType::DEMUXER,
gst::Rank::Marginal,
gst::Rank::MARGINAL,
);

if has_element_for_media_type(&audio_decoder_factories, "audio/mpeg, mpegversion=(int)4") {
Expand Down
10 changes: 6 additions & 4 deletions backends/gstreamer/render-android/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,14 @@ use std::sync::{Arc, Mutex};

struct GStreamerBuffer {
is_external_oes: bool,
frame: gst_video::VideoFrame<gst_video::video_frame::Readable>,
frame: gst_gl::GLVideoFrame<gst_gl::gl_video_frame::Readable>,
}

impl Buffer for GStreamerBuffer {
fn to_vec(&self) -> Result<VideoFrameData, ()> {
// packed formats are guaranteed to be in a single plane
if self.frame.format() == gst_video::VideoFormat::Rgba {
let tex_id = self.frame.texture_id(0).ok_or_else(|| ())?;
let tex_id = self.frame.texture_id(0).map_err(|_| ())?;
Ok(if self.is_external_oes {
VideoFrameData::OESTexture(tex_id)
} else {
Expand Down Expand Up @@ -146,7 +146,7 @@ impl Render for RenderAndroid {
}

let frame =
gst_video::VideoFrame::from_buffer_readable_gl(buffer, &info).or_else(|_| Err(()))?;
gst_gl::GLVideoFrame::from_buffer_readable(buffer, &info).or_else(|_| Err(()))?;

if self.gst_context.lock().unwrap().is_some() {
if let Some(sync_meta) = frame.buffer().meta::<gst_gl::GLSyncMeta>() {
Expand Down Expand Up @@ -192,7 +192,9 @@ impl Render for RenderAndroid {
.name("servo-media-vsink")
.property("sink", &appsink)
.build()
.map_err(|error| PlayerError::Backend(format!("glupload creation failed: {error:?}")))?;
.map_err(|error| {
PlayerError::Backend(format!("glupload creation failed: {error:?}"))
})?;

pipeline.set_property("video-sink", &vsinkbin);

Expand Down
4 changes: 2 additions & 2 deletions backends/gstreamer/render-unix/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,12 @@ name = "servo_media_gstreamer_render_unix"
path = "lib.rs"

[dependencies]
glib = "0.18"
glib = { workspace = true }
gst = { workspace = true }
gst-gl = { workspace = true }
gstreamer-gl-egl = { workspace = true, optional = true }
gstreamer-gl-x11 = { workspace = true, optional = true }
gstreamer-gl-wayland = { workspace = true, optional = true }
gst-video = { package = "gstreamer-video", version = "0.21" }
gst-video = { workspace = true }
sm-player = { package = "servo-media-player", path = "../../../player" }
sm-gst-render = { package = "servo-media-gstreamer-render", path = "../render" }
11 changes: 6 additions & 5 deletions backends/gstreamer/render-unix/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,14 @@ use std::sync::{Arc, Mutex};

struct GStreamerBuffer {
is_external_oes: bool,
frame: gst_video::VideoFrame<gst_video::video_frame::Readable>,
frame: gst_gl::GLVideoFrame<gst_gl::gl_video_frame::Readable>,
}

impl Buffer for GStreamerBuffer {
fn to_vec(&self) -> Result<VideoFrameData, ()> {
// packed formats are guaranteed to be in a single plane
if self.frame.format() == gst_video::VideoFormat::Rgba {
let tex_id = self.frame.texture_id(0).ok_or(())?;
let tex_id = self.frame.texture_id(0).map_err(|_| ())?;
Ok(if self.is_external_oes {
VideoFrameData::OESTexture(tex_id)
} else {
Expand Down Expand Up @@ -191,8 +191,7 @@ impl Render for RenderUnix {
.is_some();

let info = gst_video::VideoInfo::from_caps(caps).map_err(|_| ())?;
let frame =
gst_video::VideoFrame::from_buffer_readable_gl(buffer, &info).map_err(|_| ())?;
let frame = gst_gl::GLVideoFrame::from_buffer_readable(buffer, &info).map_err(|_| ())?;

VideoFrame::new(
info.width() as i32,
Expand All @@ -218,7 +217,9 @@ impl Render for RenderUnix {
let vsinkbin = gst::ElementFactory::make("glsinkbin")
.name("servo-media-vsink")
.build()
.map_err(|error| PlayerError::Backend(format!("glupload creation failed: {error:?}")))?;
.map_err(|error| {
PlayerError::Backend(format!("glupload creation failed: {error:?}"))
})?;

let caps = gst::Caps::builder("video/x-raw")
.features([gst_gl::CAPS_FEATURE_MEMORY_GL_MEMORY])
Expand Down
6 changes: 3 additions & 3 deletions backends/gstreamer/source.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use glib::once_cell::sync::Lazy;
use glib::subclass::prelude::*;
use gst::prelude::*;
use gst::subclass::prelude::*;
use once_cell::sync::Lazy;
use std::convert::TryFrom;
use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::Mutex;
Expand Down Expand Up @@ -242,7 +242,7 @@ mod imp {
.expect("Could not create appsrc element");

let pad_templ = klass.pad_template("src").unwrap();
let ghost_pad = gst::GhostPad::builder_from_template(&pad_templ).name("src")
let ghost_pad = gst::GhostPad::builder_from_template(&pad_templ)
.query_function(|pad, parent, query| {
ServoSrc::catch_panic_pad_function(
parent,
Expand Down Expand Up @@ -404,5 +404,5 @@ impl ServoSrc {
// under the name "servosrc" for being able to instantiate it via e.g.
// gst::ElementFactory::make().
pub fn register_servo_src() -> Result<(), glib::BoolError> {
gst::Element::register(None, "servosrc", gst::Rank::None, ServoSrc::static_type())
gst::Element::register(None, "servosrc", gst::Rank::NONE, ServoSrc::static_type())
}

0 comments on commit c04bb30

Please sign in to comment.