<div dir="ltr"><div>Hi!</div><div dir="ltr">On Sun, Sep 20, 2020 at 4:03 PM Alexandre Janniaux <<a href="mailto:ajanni@videolabs.io">ajanni@videolabs.io</a>> wrote:<br></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hi,<br>
<br>
What is the integration plan when we integrate meson?<br>
<br>
Do we remove cargo support completly and ony use the<br>
meson rust support?<br>
<br></blockquote><div>No, I think meson rust support is very limited. We should continue using cargo. We can run_command and custom_targets to integrate cargo with meson. I had made the first iteration of the cuesheet module using meson. A sample is <a href="https://code.videolan.org/gsoc/gsoc2020/rustyc/vlc/-/commit/505f293767fcc540c9402829886b38205ef1da97">here</a>. However, there are a few issues with this. The custom_target feature requires files as output as opposed to directories though (I might be wrong here since I am not much familiar with meson). The other option is to use run_command, which works fine but run_command is executed during the configure phase which means the build process will become a two step process.</div><div><br></div><div>It is probably possible to modify cargo-c in a way to output specific files, the work should be of moderate scale because cargo-c already produces the required files. We just those in a flat layout. On the meson side, we may need a source generator, Marvin might be able to advise here in detail.</div><div><br></div><div>Also, is it finalized that the build system will be ported to meson ? If it is still open for discussion and if Cmake has not been considered, I would suggest that we experiment a bit with it. Otherwise, if meson is finalized we can go ahead with it and make necessary adjustments as specified above to get it to work with meson.</div><div><br></div><div>Regards,</div><div>Kartik</div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
Regards,<br>
--<br>
Alexandre Janniaux<br>
Videolabs<br>
<br>
On Sun, Sep 20, 2020 at 02:39:33AM +0530, Kartik Ohri wrote:<br>
> The API is written in two layers. vlccore-sys<br>
> crate contains one to one bindings of libvlc<br>
> functions. vlccore-rs crate wraps vlccore-sys and<br>
> exposes a Rust idiomatic API for writing modules<br>
> in rust. As of now, the API exposes only a subset<br>
> of the vlc_stream API. More functionality can be<br>
> added to Rust API as required in the future.<br>
> ---<br>
>  .gitignore                    |   2 +-<br>
>  <a href="http://configure.ac" rel="noreferrer" target="_blank">configure.ac</a>                  |  13 ++++<br>
>  modules/<a href="http://common.am" rel="noreferrer" target="_blank">common.am</a>             |   7 ++<br>
>  src/Cargo.toml                |   2 +<br>
>  src/vlccore-rs/Cargo.toml     |  10 +++<br>
>  src/vlccore-rs/src/<a href="http://lib.rs" rel="noreferrer" target="_blank">lib.rs</a>     |   2 +<br>
>  src/vlccore-rs/src/<a href="http://stream.rs" rel="noreferrer" target="_blank">stream.rs</a>  | 126 ++++++++++++++++++++++++++++++++++<br>
>  src/vlccore-rs/src/<a href="http://utils.rs" rel="noreferrer" target="_blank">utils.rs</a>   |  19 +++++<br>
>  src/vlccore-sys/Cargo.toml    |  10 +++<br>
>  src/vlccore-sys/src/<a href="http://lib.rs" rel="noreferrer" target="_blank">lib.rs</a>    |   3 +<br>
>  src/vlccore-sys/src/<a href="http://stream.rs" rel="noreferrer" target="_blank">stream.rs</a> |  46 +++++++++++++<br>
>  11 files changed, 239 insertions(+), 1 deletion(-)<br>
>  create mode 100644 src/Cargo.toml<br>
>  create mode 100644 src/vlccore-rs/Cargo.toml<br>
>  create mode 100644 src/vlccore-rs/src/<a href="http://lib.rs" rel="noreferrer" target="_blank">lib.rs</a><br>
>  create mode 100644 src/vlccore-rs/src/<a href="http://stream.rs" rel="noreferrer" target="_blank">stream.rs</a><br>
>  create mode 100644 src/vlccore-rs/src/<a href="http://utils.rs" rel="noreferrer" target="_blank">utils.rs</a><br>
>  create mode 100644 src/vlccore-sys/Cargo.toml<br>
>  create mode 100644 src/vlccore-sys/src/<a href="http://lib.rs" rel="noreferrer" target="_blank">lib.rs</a><br>
>  create mode 100644 src/vlccore-sys/src/<a href="http://stream.rs" rel="noreferrer" target="_blank">stream.rs</a><br>
><br>
> diff --git a/.gitignore b/.gitignore<br>
> index fc368212c8..6c049a80b1 100644<br>
> --- a/.gitignore<br>
> +++ b/.gitignore<br>
> @@ -46,7 +46,7 @@ wxvlc<br>
>  vlc_install_dir/*<br>
>  plugins.dat<br>
>  patches/*<br>
> -<br>
> +**/Cargo.lock<br>
>  include/vlc/libvlc_version.h<br>
><br>
>  # Ignore build dirs<br>
> diff --git a/<a href="http://configure.ac" rel="noreferrer" target="_blank">configure.ac</a> b/<a href="http://configure.ac" rel="noreferrer" target="_blank">configure.ac</a><br>
> index 99e4669942..53d56a725c 100644<br>
> --- a/<a href="http://configure.ac" rel="noreferrer" target="_blank">configure.ac</a><br>
> +++ b/<a href="http://configure.ac" rel="noreferrer" target="_blank">configure.ac</a><br>
> @@ -1896,6 +1896,19 @@ AS_IF([test "${enable_sout}" != "no"], [<br>
>  ])<br>
>  AM_CONDITIONAL([ENABLE_SOUT], [test "${enable_sout}" != "no"])<br>
><br>
> +dnl Rust Modules<br>
> +AC_ARG_ENABLE([rust],<br>
> +    AS_HELP_STRING([--enable-rust], [enable building Rust modules (default disabled)]))<br>
> +AS_IF([test "${enable_rust}" = "yes"],<br>
> +      [AC_DEFINE(ENABLE_RUST, 1, [Define to 1 for building rust modules.])])<br>
> +AM_CONDITIONAL([BUILD_RUST], [test "${enable_rust}" = "yes"])<br>
> +if test "${enable_rust}" = "yes"<br>
> +then<br>
> +    AC_CHECK_PROG(CARGO, [cargo], [yes], [no])<br>
> +    AS_IF([test "x$CARGO" = "xno"],<br>
> +          AC_MSG_ERROR([cargo not found. cargo is required to build rust modules]))<br>
> +fi<br>
> +<br>
>  dnl Lua modules<br>
>  AC_ARG_ENABLE([lua],<br>
>    AS_HELP_STRING([--disable-lua],<br>
> diff --git a/modules/<a href="http://common.am" rel="noreferrer" target="_blank">common.am</a> b/modules/<a href="http://common.am" rel="noreferrer" target="_blank">common.am</a><br>
> index b991f6ce2f..5edc14ea26 100644<br>
> --- a/modules/<a href="http://common.am" rel="noreferrer" target="_blank">common.am</a><br>
> +++ b/modules/<a href="http://common.am" rel="noreferrer" target="_blank">common.am</a><br>
> @@ -39,6 +39,13 @@ endif<br>
>  AM_YFLAGS = -d -Wno-yacc<br>
><br>
>  SUFFIXES = .l .y .asm<br>
> +RUST_API = ../src/vlccore-sys/src/<a href="http://lib.rs" rel="noreferrer" target="_blank">lib.rs</a> \<br>
> +     ../src/vlccore-sys/src/<a href="http://stream.rs" rel="noreferrer" target="_blank">stream.rs</a> \<br>
> +     ../src/vlccore-sys/Cargo.toml \<br>
> +     ../src/vlccore-rs/src/<a href="http://lib.rs" rel="noreferrer" target="_blank">lib.rs</a> \<br>
> +     ../src/vlccore-rs/src/<a href="http://stream.rs" rel="noreferrer" target="_blank">stream.rs</a> \<br>
> +     ../src/vlccore-rs/Cargo.toml \<br>
> +     ../src/Cargo.toml<br>
><br>
>  .asm.lo:<br>
>       $(LIBTOOL) --mode=compile --tag=ASM $(X86ASM) $(X86ASMFLAGS) $(X86ASMDEFS) -I$(top_srcdir)/extras/include/x86/ $< -o $@<br>
> diff --git a/src/Cargo.toml b/src/Cargo.toml<br>
> new file mode 100644<br>
> index 0000000000..4b6346fc23<br>
> --- /dev/null<br>
> +++ b/src/Cargo.toml<br>
> @@ -0,0 +1,2 @@<br>
> +[workspace]<br>
> +members = ["vlccore-sys", "vlccore-rs"]<br>
> \ No newline at end of file<br>
> diff --git a/src/vlccore-rs/Cargo.toml b/src/vlccore-rs/Cargo.toml<br>
> new file mode 100644<br>
> index 0000000000..108c849f80<br>
> --- /dev/null<br>
> +++ b/src/vlccore-rs/Cargo.toml<br>
> @@ -0,0 +1,10 @@<br>
> +[package]<br>
> +name = "vlccore-rs"<br>
> +version = "0.1.0"<br>
> +authors = ["Kartik Ohri <<a href="mailto:kartikohri13@gmail.com" target="_blank">kartikohri13@gmail.com</a>>"]<br>
> +edition = "2018"<br>
> +license = "LGPL-2.1-or-later"<br>
> +<br>
> +[dependencies]<br>
> +libc = "0.2"<br>
> +vlccore-sys = {path="../vlccore-sys"}<br>
> \ No newline at end of file<br>
> diff --git a/src/vlccore-rs/src/<a href="http://lib.rs" rel="noreferrer" target="_blank">lib.rs</a> b/src/vlccore-rs/src/<a href="http://lib.rs" rel="noreferrer" target="_blank">lib.rs</a><br>
> new file mode 100644<br>
> index 0000000000..9fffcbc8b5<br>
> --- /dev/null<br>
> +++ b/src/vlccore-rs/src/<a href="http://lib.rs" rel="noreferrer" target="_blank">lib.rs</a><br>
> @@ -0,0 +1,2 @@<br>
> +pub mod stream;<br>
> +pub mod utils;<br>
> diff --git a/src/vlccore-rs/src/<a href="http://stream.rs" rel="noreferrer" target="_blank">stream.rs</a> b/src/vlccore-rs/src/<a href="http://stream.rs" rel="noreferrer" target="_blank">stream.rs</a><br>
> new file mode 100644<br>
> index 0000000000..afa622b4f1<br>
> --- /dev/null<br>
> +++ b/src/vlccore-rs/src/<a href="http://stream.rs" rel="noreferrer" target="_blank">stream.rs</a><br>
> @@ -0,0 +1,126 @@<br>
> +use libc::{c_char, c_void};<br>
> +use std::ffi::{CStr, CString};<br>
> +use std::io::{Error, ErrorKind, Read, Result, Seek, SeekFrom};<br>
> +use std::ptr::null_mut;<br>
> +use vlccore_sys::stream as ffi;<br>
> +<br>
> +pub struct Stream {<br>
> +    stream: *mut ffi::stream_t,<br>
> +}<br>
> +<br>
> +impl Read for Stream {<br>
> +    fn read(&mut self, buf: &mut [u8]) -> Result<usize> {<br>
> +        let bytes_read: isize = unsafe {<br>
> +            ffi::vlc_stream_Read(self.stream, buf.as_mut_ptr() as *mut c_void, buf.len())<br>
> +        };<br>
> +        if bytes_read < 0 {<br>
> +            Err(Error::new(<br>
> +                ErrorKind::Other,<br>
> +                "Error while reading from stream",<br>
> +            ))<br>
> +        } else {<br>
> +            Ok(bytes_read as usize)<br>
> +        }<br>
> +    }<br>
> +}<br>
> +<br>
> +impl Seek for Stream {<br>
> +    fn seek(&mut self, pos: SeekFrom) -> Result<u64> {<br>
> +        let offset = match pos {<br>
> +            SeekFrom::Start(n) => n,<br>
> +            SeekFrom::Current(n) => {<br>
> +                let len = self.position();<br>
> +                if n >= 0 {<br>
> +                    len.checked_add(n as u64)<br>
> +                } else {<br>
> +                    len.checked_sub(n.wrapping_neg() as u64)<br>
> +                }<br>
> +                .ok_or(Error::new(ErrorKind::Other, "Position Overflow"))?<br>
> +            }<br>
> +            SeekFrom::End(n) => self.len().and_then(|position| {<br>
> +                if n >= 0 {<br>
> +                    position.checked_add(n as u64)<br>
> +                } else {<br>
> +                    position.checked_sub(n.wrapping_neg() as u64)<br>
> +                }<br>
> +                .ok_or(Error::new(ErrorKind::Other, "Position Overflow"))<br>
> +            })?,<br>
> +        };<br>
> +<br>
> +        let result = unsafe { ffi::vlc_stream_Seek(self.stream, offset) };<br>
> +        if result != 0 {<br>
> +            return Err(Error::new(ErrorKind::Other, "Could not seek stream"));<br>
> +        }<br>
> +        Ok(offset)<br>
> +    }<br>
> +}<br>
> +<br>
> +impl Drop for Stream {<br>
> +    fn drop(&mut self) {<br>
> +        unsafe { ffi::vlc_stream_Delete(self.stream) }<br>
> +    }<br>
> +}<br>
> +<br>
> +impl From<*mut ffi::stream_t> for Stream {<br>
> +    fn from(stream: *mut ffi::stream_t) -> Self {<br>
> +        Stream { stream }<br>
> +    }<br>
> +}<br>
> +<br>
> +impl Stream {<br>
> +    pub fn len(&self) -> std::result::Result<u64, Error> {<br>
> +        let size: u64 = 0;<br>
> +        let result = unsafe {<br>
> +            ffi::vlc_stream_Control(<br>
> +                self.stream,<br>
> +                ffi::stream_query_e_STREAM_GET_SIZE as i32,<br>
> +                &size,<br>
> +            )<br>
> +        };<br>
> +        if result != 0 {<br>
> +            return Err(Error::new(<br>
> +                ErrorKind::Other,<br>
> +                "Could not determine stream size",<br>
> +            ));<br>
> +        }<br>
> +        Ok(size)<br>
> +    }<br>
> +<br>
> +    pub fn position(&self) -> u64 {<br>
> +        unsafe { ffi::vlc_stream_Tell(self.stream) }<br>
> +    }<br>
> +<br>
> +    pub fn eof(&self) -> Result<bool> {<br>
> +        Ok(unsafe { ffi::vlc_stream_Eof(self.stream) })<br>
> +    }<br>
> +<br>
> +    pub fn mimetype(&self) -> Option<String> {<br>
> +        let content_type = self.contenttype()?;<br>
> +        let index = content_type.chars().position(|c| c == ';')?;<br>
> +        Some(content_type[..index].to_owned())<br>
> +    }<br>
> +<br>
> +    pub fn contenttype(&self) -> Option<String> {<br>
> +        let result: *mut c_char = null_mut();<br>
> +        unsafe {<br>
> +            if ffi::vlc_stream_Control(<br>
> +                self.stream,<br>
> +                ffi::stream_query_e_STREAM_GET_CONTENT_TYPE as i32,<br>
> +                result,<br>
> +            ) != 0<br>
> +            {<br>
> +                return None;<br>
> +            } else if result.is_null() {<br>
> +                return None;<br>
> +            }<br>
> +            // FIXME: Free the C pointer received but retain copy of data in Rust<br>
> +            CStr::from_ptr(result).to_str().map(|s| s.to_string()).ok()<br>
> +        }<br>
> +    }<br>
> +<br>
> +    pub fn new_with_url(&mut self, url: &str) -> Self {<br>
> +        let c_url = CString::new(url).unwrap().as_ptr();<br>
> +        let stream = unsafe { ffi::vlc_stream_NewURL(self.stream, c_url) };<br>
> +        Stream { stream }<br>
> +    }<br>
> +}<br>
> diff --git a/src/vlccore-rs/src/<a href="http://utils.rs" rel="noreferrer" target="_blank">utils.rs</a> b/src/vlccore-rs/src/<a href="http://utils.rs" rel="noreferrer" target="_blank">utils.rs</a><br>
> new file mode 100644<br>
> index 0000000000..3d9e25ac31<br>
> --- /dev/null<br>
> +++ b/src/vlccore-rs/src/<a href="http://utils.rs" rel="noreferrer" target="_blank">utils.rs</a><br>
> @@ -0,0 +1,19 @@<br>
> +use libc::{c_char, malloc};<br>
> +use std::ffi::CString;<br>
> +use std::ptr::null_mut;<br>
> +use std::slice::from_raw_parts_mut;<br>
> +<br>
> +pub unsafe fn convert_string_to_ptr(string: String) -> *mut c_char {<br>
> +    if string.is_empty() {<br>
> +        return std::ptr::null_mut();<br>
> +    }<br>
> +    let size = string.len() + 1;<br>
> +    CString::new(string)<br>
> +        .map(|ptr| {<br>
> +            let c_ptr = malloc(size * std::mem::size_of::<u8>()) as *mut u8;<br>
> +            let slice = from_raw_parts_mut(c_ptr, size);<br>
> +            slice[..size].copy_from_slice(ptr.as_bytes_with_nul());<br>
> +            c_ptr as *mut c_char<br>
> +        })<br>
> +        .unwrap_or(null_mut())<br>
> +}<br>
> diff --git a/src/vlccore-sys/Cargo.toml b/src/vlccore-sys/Cargo.toml<br>
> new file mode 100644<br>
> index 0000000000..0dde7b2e7d<br>
> --- /dev/null<br>
> +++ b/src/vlccore-sys/Cargo.toml<br>
> @@ -0,0 +1,10 @@<br>
> +[package]<br>
> +name = "vlccore-sys"<br>
> +version = "0.1.0"<br>
> +authors = ["Kartik Ohri <<a href="mailto:kartikohri13@gmail.com" target="_blank">kartikohri13@gmail.com</a>>"]<br>
> +edition = "2018"<br>
> +license = "LGPL-2.1-or-later"<br>
> +<br>
> +[dependencies]<br>
> +libc = "0.2"<br>
> +<br>
> diff --git a/src/vlccore-sys/src/<a href="http://lib.rs" rel="noreferrer" target="_blank">lib.rs</a> b/src/vlccore-sys/src/<a href="http://lib.rs" rel="noreferrer" target="_blank">lib.rs</a><br>
> new file mode 100644<br>
> index 0000000000..08201d88ba<br>
> --- /dev/null<br>
> +++ b/src/vlccore-sys/src/<a href="http://lib.rs" rel="noreferrer" target="_blank">lib.rs</a><br>
> @@ -0,0 +1,3 @@<br>
> +#![allow(non_camel_case_types)]<br>
> +#![allow(non_upper_case_globals)]<br>
> +pub mod stream;<br>
> diff --git a/src/vlccore-sys/src/<a href="http://stream.rs" rel="noreferrer" target="_blank">stream.rs</a> b/src/vlccore-sys/src/<a href="http://stream.rs" rel="noreferrer" target="_blank">stream.rs</a><br>
> new file mode 100644<br>
> index 0000000000..e9df363998<br>
> --- /dev/null<br>
> +++ b/src/vlccore-sys/src/<a href="http://stream.rs" rel="noreferrer" target="_blank">stream.rs</a><br>
> @@ -0,0 +1,46 @@<br>
> +use libc::{c_char, c_int, c_void, size_t, ssize_t};<br>
> +<br>
> +#[repr(C)]<br>
> +pub struct stream_t {<br>
> +    _private: [u8; 0],<br>
> +}<br>
> +<br>
> +pub const stream_query_e_STREAM_CAN_SEEK: stream_query_e = 0;<br>
> +pub const stream_query_e_STREAM_CAN_FASTSEEK: stream_query_e = 1;<br>
> +pub const stream_query_e_STREAM_CAN_PAUSE: stream_query_e = 2;<br>
> +pub const stream_query_e_STREAM_CAN_CONTROL_PACE: stream_query_e = 3;<br>
> +pub const stream_query_e_STREAM_GET_SIZE: stream_query_e = 6;<br>
> +pub const stream_query_e_STREAM_GET_PTS_DELAY: stream_query_e = 257;<br>
> +pub const stream_query_e_STREAM_GET_TITLE_INFO: stream_query_e = 258;<br>
> +pub const stream_query_e_STREAM_GET_TITLE: stream_query_e = 259;<br>
> +pub const stream_query_e_STREAM_GET_SEEKPOINT: stream_query_e = 260;<br>
> +pub const stream_query_e_STREAM_GET_META: stream_query_e = 261;<br>
> +pub const stream_query_e_STREAM_GET_CONTENT_TYPE: stream_query_e = 262;<br>
> +pub const stream_query_e_STREAM_GET_SIGNAL: stream_query_e = 263;<br>
> +pub const stream_query_e_STREAM_GET_TAGS: stream_query_e = 264;<br>
> +pub const stream_query_e_STREAM_SET_PAUSE_STATE: stream_query_e = 512;<br>
> +pub const stream_query_e_STREAM_SET_TITLE: stream_query_e = 513;<br>
> +pub const stream_query_e_STREAM_SET_SEEKPOINT: stream_query_e = 514;<br>
> +pub const stream_query_e_STREAM_SET_RECORD_STATE: stream_query_e = 515;<br>
> +pub const stream_query_e_STREAM_SET_PRIVATE_ID_STATE: stream_query_e = 4096;<br>
> +pub const stream_query_e_STREAM_SET_PRIVATE_ID_CA: stream_query_e = 4097;<br>
> +pub const stream_query_e_STREAM_GET_PRIVATE_ID_STATE: stream_query_e = 4098;<br>
> +pub type stream_query_e = ::std::os::raw::c_uint;<br>
> +<br>
> +pub type vlc_object_t = stream_t;<br>
> +<br>
> +extern "C" {<br>
> +    pub fn vlc_stream_Read(s: *mut stream_t, buf: *mut c_void, len: size_t) -> ssize_t;<br>
> +<br>
> +    pub fn vlc_stream_Tell(s: *const stream_t) -> u64;<br>
> +<br>
> +    pub fn vlc_stream_Eof(s: *const stream_t) -> bool;<br>
> +<br>
> +    pub fn vlc_stream_Seek(s: *mut stream_t, offset: u64) -> c_int;<br>
> +<br>
> +    pub fn vlc_stream_Control(s: *mut stream_t, query: c_int, ...) -> c_int;<br>
> +<br>
> +    pub fn vlc_stream_Delete(s: *mut stream_t);<br>
> +<br>
> +    pub fn vlc_stream_NewURL(obj: *mut vlc_object_t, url: *const c_char) -> *mut stream_t;<br>
> +}<br>
> --<br>
> 2.25.1<br>
><br>
> _______________________________________________<br>
> vlc-devel mailing list<br>
> To unsubscribe or modify your subscription options:<br>
> <a href="https://mailman.videolan.org/listinfo/vlc-devel" rel="noreferrer" target="_blank">https://mailman.videolan.org/listinfo/vlc-devel</a><br>
_______________________________________________<br>
vlc-devel mailing list<br>
To unsubscribe or modify your subscription options:<br>
<a href="https://mailman.videolan.org/listinfo/vlc-devel" rel="noreferrer" target="_blank">https://mailman.videolan.org/listinfo/vlc-devel</a></blockquote></div></div>