mirror of
https://github.com/servo/servo.git
synced 2025-06-06 16:45:39 +00:00
Rename servosrc to servowebsrc
This commit is contained in:
parent
aa268e154f
commit
722e60c9b1
3 changed files with 47 additions and 47 deletions
|
@ -23,7 +23,7 @@ cp target/release/libgstservoplugin.* target/gstplugins
|
||||||
To run locally:
|
To run locally:
|
||||||
```
|
```
|
||||||
GST_PLUGIN_PATH=target/gstplugins \
|
GST_PLUGIN_PATH=target/gstplugins \
|
||||||
gst-launch-1.0 servosrc \
|
gst-launch-1.0 servowebsrc \
|
||||||
! videorate \
|
! videorate \
|
||||||
! video/x-raw\(memory:GLMemory\),framerate=50/1,width=1920,height=1080,format=RGBA \
|
! video/x-raw\(memory:GLMemory\),framerate=50/1,width=1920,height=1080,format=RGBA \
|
||||||
! glimagesink rotate-method=vertical-flip
|
! glimagesink rotate-method=vertical-flip
|
||||||
|
@ -32,7 +32,7 @@ GST_PLUGIN_PATH=target/gstplugins \
|
||||||
To stream over the network:
|
To stream over the network:
|
||||||
```
|
```
|
||||||
GST_PLUGIN_PATH=target/gstplugins \
|
GST_PLUGIN_PATH=target/gstplugins \
|
||||||
gst-launch-1.0 servosrc \
|
gst-launch-1.0 servowebsrc \
|
||||||
! videorate \
|
! videorate \
|
||||||
! video/x-raw\(memory:GLMemory\),framerate=50/1,width=512,height=256 \
|
! video/x-raw\(memory:GLMemory\),framerate=50/1,width=512,height=256 \
|
||||||
! glcolorconvert \
|
! glcolorconvert \
|
||||||
|
@ -46,7 +46,7 @@ GST_PLUGIN_PATH=target/gstplugins \
|
||||||
To save to a file:
|
To save to a file:
|
||||||
```
|
```
|
||||||
GST_PLUGIN_PATH=target/gstplugins \
|
GST_PLUGIN_PATH=target/gstplugins \
|
||||||
gst-launch-1.0 servosrc \
|
gst-launch-1.0 servowebsrc \
|
||||||
! videorate \
|
! videorate \
|
||||||
! video/x-raw\(memory:GLMemory\),framerate=50/1,width=512,height=256 \
|
! video/x-raw\(memory:GLMemory\),framerate=50/1,width=512,height=256 \
|
||||||
! glcolorconvert \
|
! glcolorconvert \
|
||||||
|
@ -76,7 +76,7 @@ LD_LIBRARY_PATH=$PWD/support/linux/gstreamer/gst/lib \
|
||||||
First try:
|
First try:
|
||||||
```
|
```
|
||||||
GST_PLUGIN_PATH=target/gstplugins \
|
GST_PLUGIN_PATH=target/gstplugins \
|
||||||
gst-inspect-1.0 servosrc
|
gst-inspect-1.0 servowebsrc
|
||||||
```
|
```
|
||||||
|
|
||||||
If that doesn't work, try:
|
If that doesn't work, try:
|
||||||
|
@ -125,7 +125,7 @@ GST_PLUGIN_PATH=$PWD/target/gstplugins/:$PWD/support/linux/gstreamer/gst/lib \
|
||||||
GST_PLUGIN_SCANNER=$PWD/support/linux/gstreamer/gst/libexec/gstreamer-1.0/gst-plugin-scanner \
|
GST_PLUGIN_SCANNER=$PWD/support/linux/gstreamer/gst/libexec/gstreamer-1.0/gst-plugin-scanner \
|
||||||
LD_LIBRARY_PATH=$PWD/support/linux/gstreamer/gst/lib \
|
LD_LIBRARY_PATH=$PWD/support/linux/gstreamer/gst/lib \
|
||||||
LD_PRELOAD=$PWD/target/gstplugins/libgstservoplugin.so \
|
LD_PRELOAD=$PWD/target/gstplugins/libgstservoplugin.so \
|
||||||
gst-launch-1.0 servosrc \
|
gst-launch-1.0 servowebsrc \
|
||||||
! queue \
|
! queue \
|
||||||
! videoflip video-direction=vert \
|
! videoflip video-direction=vert \
|
||||||
! ximagesink
|
! ximagesink
|
||||||
|
|
|
@ -4,11 +4,11 @@
|
||||||
|
|
||||||
use glib::subclass::types::ObjectSubclass;
|
use glib::subclass::types::ObjectSubclass;
|
||||||
use gstreamer::gst_plugin_define;
|
use gstreamer::gst_plugin_define;
|
||||||
use servosrc::ServoGstSrc;
|
use servowebsrc::ServoWebSrc;
|
||||||
|
|
||||||
mod logging;
|
mod logging;
|
||||||
mod resources;
|
mod resources;
|
||||||
mod servosrc;
|
mod servowebsrc;
|
||||||
|
|
||||||
gst_plugin_define!(
|
gst_plugin_define!(
|
||||||
servoplugin,
|
servoplugin,
|
||||||
|
@ -33,8 +33,8 @@ fn plugin_init(plugin: &gstreamer::Plugin) -> Result<(), glib::BoolError> {
|
||||||
log::debug!("Registering plugin");
|
log::debug!("Registering plugin");
|
||||||
gstreamer::Element::register(
|
gstreamer::Element::register(
|
||||||
Some(plugin),
|
Some(plugin),
|
||||||
"servosrc",
|
"servowebsrc",
|
||||||
gstreamer::Rank::None,
|
gstreamer::Rank::None,
|
||||||
ServoGstSrc::get_type(),
|
ServoWebSrc::get_type(),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -92,15 +92,15 @@ use std::rc::Rc;
|
||||||
use std::sync::Mutex;
|
use std::sync::Mutex;
|
||||||
use std::thread;
|
use std::thread;
|
||||||
|
|
||||||
pub struct ServoGstSrc {
|
pub struct ServoWebSrc {
|
||||||
sender: Sender<ServoSrcMsg>,
|
sender: Sender<ServoWebSrcMsg>,
|
||||||
swap_chain: SwapChain,
|
swap_chain: SwapChain,
|
||||||
url: Mutex<Option<String>>,
|
url: Mutex<Option<String>>,
|
||||||
info: Mutex<Option<VideoInfo>>,
|
info: Mutex<Option<VideoInfo>>,
|
||||||
buffer_pool: Mutex<Option<BufferPool>>,
|
buffer_pool: Mutex<Option<BufferPool>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ServoSrcGfx {
|
struct ServoWebSrcGfx {
|
||||||
device: Device,
|
device: Device,
|
||||||
context: Context,
|
context: Context,
|
||||||
gl: Rc<Gl>,
|
gl: Rc<Gl>,
|
||||||
|
@ -108,7 +108,7 @@ struct ServoSrcGfx {
|
||||||
draw_fbo: GLuint,
|
draw_fbo: GLuint,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Drop for ServoSrcGfx {
|
impl Drop for ServoWebSrcGfx {
|
||||||
fn drop(&mut self) {
|
fn drop(&mut self) {
|
||||||
self.gl.delete_framebuffers(&[self.read_fbo, self.draw_fbo]);
|
self.gl.delete_framebuffers(&[self.read_fbo, self.draw_fbo]);
|
||||||
let _ = self.device.destroy_context(&mut self.context);
|
let _ = self.device.destroy_context(&mut self.context);
|
||||||
|
@ -116,11 +116,11 @@ impl Drop for ServoSrcGfx {
|
||||||
}
|
}
|
||||||
|
|
||||||
thread_local! {
|
thread_local! {
|
||||||
static GFX_CACHE: RefCell<HashMap<GLContext, ServoSrcGfx>> = RefCell::new(HashMap::new());
|
static GFX_CACHE: RefCell<HashMap<GLContext, ServoWebSrcGfx>> = RefCell::new(HashMap::new());
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
enum ServoSrcMsg {
|
enum ServoWebSrcMsg {
|
||||||
Start(ServoUrl),
|
Start(ServoUrl),
|
||||||
GetSwapChain(Sender<SwapChain>),
|
GetSwapChain(Sender<SwapChain>),
|
||||||
Resize(Size2D<i32, DevicePixel>),
|
Resize(Size2D<i32, DevicePixel>),
|
||||||
|
@ -132,16 +132,16 @@ const DEFAULT_URL: &'static str =
|
||||||
"https://rawcdn.githack.com/mrdoob/three.js/r105/examples/webgl_animation_cloth.html";
|
"https://rawcdn.githack.com/mrdoob/three.js/r105/examples/webgl_animation_cloth.html";
|
||||||
|
|
||||||
struct ServoThread {
|
struct ServoThread {
|
||||||
receiver: Receiver<ServoSrcMsg>,
|
receiver: Receiver<ServoWebSrcMsg>,
|
||||||
swap_chain: SwapChain,
|
swap_chain: SwapChain,
|
||||||
gfx: Rc<RefCell<ServoSrcGfx>>,
|
gfx: Rc<RefCell<ServoWebSrcGfx>>,
|
||||||
servo: Servo<ServoSrcWindow>,
|
servo: Servo<ServoWebSrcWindow>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ServoThread {
|
impl ServoThread {
|
||||||
fn new(receiver: Receiver<ServoSrcMsg>) -> Self {
|
fn new(receiver: Receiver<ServoWebSrcMsg>) -> Self {
|
||||||
let embedder = Box::new(ServoSrcEmbedder);
|
let embedder = Box::new(ServoWebSrcEmbedder);
|
||||||
let window = Rc::new(ServoSrcWindow::new());
|
let window = Rc::new(ServoWebSrcWindow::new());
|
||||||
let swap_chain = window.swap_chain.clone();
|
let swap_chain = window.swap_chain.clone();
|
||||||
let gfx = window.gfx.clone();
|
let gfx = window.gfx.clone();
|
||||||
let servo = Servo::new(embedder, window);
|
let servo = Servo::new(embedder, window);
|
||||||
|
@ -157,13 +157,13 @@ impl ServoThread {
|
||||||
while let Ok(msg) = self.receiver.recv() {
|
while let Ok(msg) = self.receiver.recv() {
|
||||||
debug!("Servo thread handling message {:?}", msg);
|
debug!("Servo thread handling message {:?}", msg);
|
||||||
match msg {
|
match msg {
|
||||||
ServoSrcMsg::Start(url) => self.new_browser(url),
|
ServoWebSrcMsg::Start(url) => self.new_browser(url),
|
||||||
ServoSrcMsg::GetSwapChain(sender) => sender
|
ServoWebSrcMsg::GetSwapChain(sender) => sender
|
||||||
.send(self.swap_chain.clone())
|
.send(self.swap_chain.clone())
|
||||||
.expect("Failed to send swap chain"),
|
.expect("Failed to send swap chain"),
|
||||||
ServoSrcMsg::Resize(size) => self.resize(size),
|
ServoWebSrcMsg::Resize(size) => self.resize(size),
|
||||||
ServoSrcMsg::Heartbeat => self.servo.handle_events(vec![]),
|
ServoWebSrcMsg::Heartbeat => self.servo.handle_events(vec![]),
|
||||||
ServoSrcMsg::Stop => break,
|
ServoWebSrcMsg::Stop => break,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
self.servo.handle_events(vec![WindowEvent::Quit]);
|
self.servo.handle_events(vec![WindowEvent::Quit]);
|
||||||
|
@ -215,29 +215,29 @@ impl Drop for ServoThread {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ServoSrcEmbedder;
|
struct ServoWebSrcEmbedder;
|
||||||
|
|
||||||
impl EmbedderMethods for ServoSrcEmbedder {
|
impl EmbedderMethods for ServoWebSrcEmbedder {
|
||||||
fn create_event_loop_waker(&mut self) -> Box<dyn EventLoopWaker> {
|
fn create_event_loop_waker(&mut self) -> Box<dyn EventLoopWaker> {
|
||||||
Box::new(ServoSrcEmbedder)
|
Box::new(ServoWebSrcEmbedder)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl EventLoopWaker for ServoSrcEmbedder {
|
impl EventLoopWaker for ServoWebSrcEmbedder {
|
||||||
fn clone_box(&self) -> Box<dyn EventLoopWaker> {
|
fn clone_box(&self) -> Box<dyn EventLoopWaker> {
|
||||||
Box::new(ServoSrcEmbedder)
|
Box::new(ServoWebSrcEmbedder)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn wake(&self) {}
|
fn wake(&self) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ServoSrcWindow {
|
struct ServoWebSrcWindow {
|
||||||
swap_chain: SwapChain,
|
swap_chain: SwapChain,
|
||||||
gfx: Rc<RefCell<ServoSrcGfx>>,
|
gfx: Rc<RefCell<ServoWebSrcGfx>>,
|
||||||
gl: Rc<dyn gleam::gl::Gl>,
|
gl: Rc<dyn gleam::gl::Gl>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ServoSrcWindow {
|
impl ServoWebSrcWindow {
|
||||||
fn new() -> Self {
|
fn new() -> Self {
|
||||||
let version = surfman::GLVersion { major: 4, minor: 3 };
|
let version = surfman::GLVersion { major: 4, minor: 3 };
|
||||||
let flags = surfman::ContextAttributeFlags::empty();
|
let flags = surfman::ContextAttributeFlags::empty();
|
||||||
|
@ -304,7 +304,7 @@ impl ServoSrcWindow {
|
||||||
|
|
||||||
device.make_no_context_current().unwrap();
|
device.make_no_context_current().unwrap();
|
||||||
|
|
||||||
let gfx = Rc::new(RefCell::new(ServoSrcGfx {
|
let gfx = Rc::new(RefCell::new(ServoWebSrcGfx {
|
||||||
device,
|
device,
|
||||||
context,
|
context,
|
||||||
gl,
|
gl,
|
||||||
|
@ -320,7 +320,7 @@ impl ServoSrcWindow {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl WindowMethods for ServoSrcWindow {
|
impl WindowMethods for ServoWebSrcWindow {
|
||||||
fn present(&self) {
|
fn present(&self) {
|
||||||
debug!("EMBEDDER present");
|
debug!("EMBEDDER present");
|
||||||
let mut gfx = self.gfx.borrow_mut();
|
let mut gfx = self.gfx.borrow_mut();
|
||||||
|
@ -420,8 +420,8 @@ const CAPS: &str = "video/x-raw(memory:GLMemory),
|
||||||
height=[1,2147483647],
|
height=[1,2147483647],
|
||||||
framerate=[0/1,2147483647/1]";
|
framerate=[0/1,2147483647/1]";
|
||||||
|
|
||||||
impl ObjectSubclass for ServoGstSrc {
|
impl ObjectSubclass for ServoWebSrc {
|
||||||
const NAME: &'static str = "ServoGstSrc";
|
const NAME: &'static str = "ServoWebSrc";
|
||||||
// gstreamer-gl doesn't have support for GLBaseSrc yet
|
// gstreamer-gl doesn't have support for GLBaseSrc yet
|
||||||
// https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/issues/219
|
// https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/issues/219
|
||||||
type ParentType = BaseSrc;
|
type ParentType = BaseSrc;
|
||||||
|
@ -432,7 +432,7 @@ impl ObjectSubclass for ServoGstSrc {
|
||||||
let (sender, receiver) = crossbeam_channel::bounded(1);
|
let (sender, receiver) = crossbeam_channel::bounded(1);
|
||||||
thread::spawn(move || ServoThread::new(receiver).run());
|
thread::spawn(move || ServoThread::new(receiver).run());
|
||||||
let (acks, ackr) = crossbeam_channel::bounded(1);
|
let (acks, ackr) = crossbeam_channel::bounded(1);
|
||||||
let _ = sender.send(ServoSrcMsg::GetSwapChain(acks));
|
let _ = sender.send(ServoWebSrcMsg::GetSwapChain(acks));
|
||||||
let swap_chain = ackr.recv().expect("Failed to get swap chain");
|
let swap_chain = ackr.recv().expect("Failed to get swap chain");
|
||||||
let info = Mutex::new(None);
|
let info = Mutex::new(None);
|
||||||
let url = Mutex::new(None);
|
let url = Mutex::new(None);
|
||||||
|
@ -464,7 +464,7 @@ impl ObjectSubclass for ServoGstSrc {
|
||||||
glib_object_subclass!();
|
glib_object_subclass!();
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ObjectImpl for ServoGstSrc {
|
impl ObjectImpl for ServoWebSrc {
|
||||||
glib_object_impl!();
|
glib_object_impl!();
|
||||||
|
|
||||||
fn constructed(&self, obj: &glib::Object) {
|
fn constructed(&self, obj: &glib::Object) {
|
||||||
|
@ -499,12 +499,12 @@ impl ObjectImpl for ServoGstSrc {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ElementImpl for ServoGstSrc {}
|
impl ElementImpl for ServoWebSrc {}
|
||||||
|
|
||||||
thread_local! {
|
thread_local! {
|
||||||
static GL: RefCell<Option<Rc<Gl>>> = RefCell::new(None);
|
static GL: RefCell<Option<Rc<Gl>>> = RefCell::new(None);
|
||||||
}
|
}
|
||||||
impl BaseSrcImpl for ServoGstSrc {
|
impl BaseSrcImpl for ServoWebSrc {
|
||||||
fn set_caps(&self, src: &BaseSrc, outcaps: &Caps) -> Result<(), LoggableError> {
|
fn set_caps(&self, src: &BaseSrc, outcaps: &Caps) -> Result<(), LoggableError> {
|
||||||
// Save the video info for later use
|
// Save the video info for later use
|
||||||
let info = VideoInfo::from_caps(outcaps)
|
let info = VideoInfo::from_caps(outcaps)
|
||||||
|
@ -566,13 +566,13 @@ impl BaseSrcImpl for ServoGstSrc {
|
||||||
let url = guard.as_ref().map(|s| &**s).unwrap_or(DEFAULT_URL);
|
let url = guard.as_ref().map(|s| &**s).unwrap_or(DEFAULT_URL);
|
||||||
let url = ServoUrl::parse(url)
|
let url = ServoUrl::parse(url)
|
||||||
.map_err(|_| gst_error_msg!(ResourceError::Settings, ["Failed to parse url"]))?;
|
.map_err(|_| gst_error_msg!(ResourceError::Settings, ["Failed to parse url"]))?;
|
||||||
let _ = self.sender.send(ServoSrcMsg::Start(url));
|
let _ = self.sender.send(ServoWebSrcMsg::Start(url));
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn stop(&self, _src: &BaseSrc) -> Result<(), ErrorMessage> {
|
fn stop(&self, _src: &BaseSrc) -> Result<(), ErrorMessage> {
|
||||||
info!("Stopping");
|
info!("Stopping");
|
||||||
let _ = self.sender.send(ServoSrcMsg::Stop);
|
let _ = self.sender.send(ServoWebSrcMsg::Stop);
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -636,7 +636,7 @@ impl BaseSrcImpl for ServoGstSrc {
|
||||||
}));
|
}));
|
||||||
let draw_fbo = gl.gen_framebuffers(1)[0];
|
let draw_fbo = gl.gen_framebuffers(1)[0];
|
||||||
let read_fbo = gl.gen_framebuffers(1)[0];
|
let read_fbo = gl.gen_framebuffers(1)[0];
|
||||||
ServoSrcGfx {
|
ServoWebSrcGfx {
|
||||||
device,
|
device,
|
||||||
context,
|
context,
|
||||||
gl,
|
gl,
|
||||||
|
@ -675,7 +675,7 @@ impl BaseSrcImpl for ServoGstSrc {
|
||||||
if size != surface_size {
|
if size != surface_size {
|
||||||
// If we're being asked to fill frames that are a different size than servo is providing,
|
// If we're being asked to fill frames that are a different size than servo is providing,
|
||||||
// ask it to change size.
|
// ask it to change size.
|
||||||
let _ = self.sender.send(ServoSrcMsg::Resize(size));
|
let _ = self.sender.send(ServoWebSrcMsg::Resize(size));
|
||||||
}
|
}
|
||||||
|
|
||||||
let surface_texture = gfx
|
let surface_texture = gfx
|
||||||
|
@ -765,7 +765,7 @@ impl BaseSrcImpl for ServoGstSrc {
|
||||||
FlowError::Error
|
FlowError::Error
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
let _ = self.sender.send(ServoSrcMsg::Heartbeat);
|
let _ = self.sender.send(ServoWebSrcMsg::Heartbeat);
|
||||||
Ok(buffer)
|
Ok(buffer)
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Add table
Add a link
Reference in a new issue