Rename servosrc to servowebsrc

This commit is contained in:
Alan Jeffrey 2019-12-11 09:47:53 -06:00
parent aa268e154f
commit 722e60c9b1
3 changed files with 47 additions and 47 deletions

View file

@ -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

View file

@ -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(),
) )
} }

View file

@ -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)
} }
} }