gstreamer-rtp: Update manual code to 2018 edition

This commit is contained in:
Sebastian Dröge 2020-11-22 12:34:50 +02:00
parent 1ea6fac9f4
commit db8b8be2dd
3 changed files with 72 additions and 99 deletions

View file

@ -11,30 +11,28 @@ homepage = "https://gstreamer.freedesktop.org"
documentation = "https://gstreamer.pages.freedesktop.org/gstreamer-rs/gstreamer_rtp/"
keywords = ["gstreamer", "multimedia", "audio", "video", "gnome"]
build = "build.rs"
edition = "2018"
[dependencies]
bitflags = "1.0"
once_cell = "1.0"
glib-sys = { git = "https://github.com/gtk-rs/gtk-rs" }
gobject-sys = { git = "https://github.com/gtk-rs/gtk-rs" }
gstreamer-sys = { path = "../gstreamer/sys", features = ["v1_8"] }
gstreamer-rtp-sys = { path = "../gstreamer-rtp/sys", features = ["v1_8"] }
ffi = { package = "gstreamer-rtp-sys", path = "../gstreamer-rtp/sys", features = ["v1_8"] }
glib = { git = "https://github.com/gtk-rs/gtk-rs" }
gstreamer = { path = "../gstreamer" }
gst = { package = "gstreamer", path = "../gstreamer" }
[build-dependencies]
gstreamer-rs-lgpl-docs = { path = "../docs", optional = true }
[features]
default = []
v1_10 = ["gstreamer/v1_10", "gstreamer-rtp-sys/v1_10"]
v1_12 = ["gstreamer/v1_12", "gstreamer-rtp-sys/v1_12", "v1_10"]
v1_14 = ["gstreamer/v1_14", "gstreamer-rtp-sys/v1_14", "v1_12"]
v1_16 = ["gstreamer/v1_16", "gstreamer-rtp-sys/v1_16", "v1_14"]
v1_18 = ["gstreamer/v1_18", "gstreamer-rtp-sys/v1_18", "v1_16"]
v1_10 = ["gst/v1_10", "ffi/v1_10"]
v1_12 = ["gst/v1_12", "ffi/v1_12", "v1_10"]
v1_14 = ["gst/v1_14", "ffi/v1_14", "v1_12"]
v1_16 = ["gst/v1_16", "ffi/v1_16", "v1_14"]
v1_18 = ["gst/v1_18", "ffi/v1_18", "v1_16"]
embed-lgpl-docs = ["gstreamer-rs-lgpl-docs"]
purge-lgpl-docs = ["gstreamer-rs-lgpl-docs"]
dox = ["v1_18", "gstreamer-rtp-sys/dox", "glib/dox", "gstreamer/dox"]
dox = ["v1_18", "ffi/dox", "glib/dox", "gst/dox"]
[package.metadata.docs.rs]
dox = ["v1_18", "gstreamer-rtp-sys/dox", "glib/dox", "gstreamer/dox"]
dox = ["v1_18", "ffi/dox", "glib/dox", "gst/dox"]

View file

@ -8,22 +8,11 @@
#![cfg_attr(feature = "dox", feature(doc_cfg))]
#[macro_use]
extern crate bitflags;
extern crate once_cell;
#[allow(unused_imports)]
#[macro_use]
extern crate glib;
extern crate glib_sys;
extern crate gobject_sys;
extern crate gstreamer as gst;
extern crate gstreamer_rtp_sys as gst_rtp_sys;
extern crate gstreamer_sys as gst_sys;
pub use ffi;
macro_rules! assert_initialized_main_thread {
() => {
if unsafe { ::gst_sys::gst_is_initialized() } != ::glib_sys::GTRUE {
if unsafe { gst::ffi::gst_is_initialized() } != glib::ffi::GTRUE {
panic!("GStreamer has not been initialized. Call `gst::init` first.");
}
};
@ -38,10 +27,10 @@ macro_rules! skip_assert_initialized {
#[allow(clippy::match_same_arms)]
#[allow(non_snake_case)]
mod auto;
pub use auto::*;
pub use crate::auto::*;
pub mod rtp_buffer;
pub use rtp_buffer::{compare_seqnum, RTPBuffer, RTPBufferExt};
pub use crate::rtp_buffer::{compare_seqnum, RTPBuffer, RTPBufferExt};
// Re-export all the traits in a prelude module, so that applications
// can always "use gst::prelude::*" without getting conflicts
@ -49,7 +38,7 @@ pub mod prelude {
pub use glib::prelude::*;
pub use gst::prelude::*;
pub use auto::traits::*;
pub use crate::auto::traits::*;
pub use rtp_buffer::RTPBufferExt;
pub use crate::rtp_buffer::RTPBufferExt;
}

View file

@ -5,13 +5,11 @@ use std::mem;
use std::ptr;
use std::slice;
use gst_rtp_sys;
pub enum Readable {}
pub enum Writable {}
pub struct RTPBuffer<'a, T> {
rtp_buffer: gst_rtp_sys::GstRTPBuffer,
rtp_buffer: ffi::GstRTPBuffer,
buffer: &'a gst::Buffer,
phantom: PhantomData<T>,
}
@ -36,9 +34,9 @@ impl<'a> RTPBuffer<'a, Readable> {
skip_assert_initialized!();
unsafe {
let mut rtp_buffer = mem::MaybeUninit::zeroed();
let res: bool = from_glib(gst_rtp_sys::gst_rtp_buffer_map(
let res: bool = from_glib(ffi::gst_rtp_buffer_map(
buffer.as_mut_ptr(),
gst_sys::GST_MAP_READ,
gst::ffi::GST_MAP_READ,
rtp_buffer.as_mut_ptr(),
));
@ -49,7 +47,7 @@ impl<'a> RTPBuffer<'a, Readable> {
phantom: PhantomData,
})
} else {
Err(glib_bool_error!("Failed to map RTP buffer readable"))
Err(glib::glib_bool_error!("Failed to map RTP buffer readable"))
}
}
}
@ -62,9 +60,9 @@ impl<'a> RTPBuffer<'a, Writable> {
skip_assert_initialized!();
unsafe {
let mut rtp_buffer = mem::MaybeUninit::zeroed();
let res: bool = from_glib(gst_rtp_sys::gst_rtp_buffer_map(
let res: bool = from_glib(ffi::gst_rtp_buffer_map(
buffer.as_mut_ptr(),
gst_sys::GST_MAP_READWRITE,
gst::ffi::GST_MAP_READWRITE,
rtp_buffer.as_mut_ptr(),
));
@ -75,47 +73,45 @@ impl<'a> RTPBuffer<'a, Writable> {
phantom: PhantomData,
})
} else {
Err(glib_bool_error!("Failed to map RTP buffer writable"))
Err(glib::glib_bool_error!("Failed to map RTP buffer writable"))
}
}
}
pub fn set_seq(&mut self, seq: u16) {
unsafe {
gst_rtp_sys::gst_rtp_buffer_set_seq(&mut self.rtp_buffer, seq);
ffi::gst_rtp_buffer_set_seq(&mut self.rtp_buffer, seq);
}
}
pub fn set_marker(&mut self, m: bool) {
unsafe {
gst_rtp_sys::gst_rtp_buffer_set_marker(&mut self.rtp_buffer, m.to_glib());
ffi::gst_rtp_buffer_set_marker(&mut self.rtp_buffer, m.to_glib());
}
}
pub fn set_payload_type(&mut self, pt: u8) {
unsafe {
gst_rtp_sys::gst_rtp_buffer_set_payload_type(&mut self.rtp_buffer, pt);
ffi::gst_rtp_buffer_set_payload_type(&mut self.rtp_buffer, pt);
}
}
pub fn set_ssrc(&mut self, ssrc: u32) {
unsafe { gst_rtp_sys::gst_rtp_buffer_set_ssrc(&mut self.rtp_buffer, ssrc) }
unsafe { ffi::gst_rtp_buffer_set_ssrc(&mut self.rtp_buffer, ssrc) }
}
pub fn set_csrc(&mut self, idx: u8, ssrc: u32) {
unsafe { gst_rtp_sys::gst_rtp_buffer_set_csrc(&mut self.rtp_buffer, idx, ssrc) }
unsafe { ffi::gst_rtp_buffer_set_csrc(&mut self.rtp_buffer, idx, ssrc) }
}
pub fn set_timestamp(&mut self, rtptime: u32) {
unsafe {
gst_rtp_sys::gst_rtp_buffer_set_timestamp(&mut self.rtp_buffer, rtptime);
ffi::gst_rtp_buffer_set_timestamp(&mut self.rtp_buffer, rtptime);
}
}
pub fn set_extension(&mut self, extension: bool) {
unsafe {
gst_rtp_sys::gst_rtp_buffer_set_extension(&mut self.rtp_buffer, extension.to_glib())
}
unsafe { ffi::gst_rtp_buffer_set_extension(&mut self.rtp_buffer, extension.to_glib()) }
}
pub fn add_extension_onebyte_header(
@ -132,16 +128,18 @@ impl<'a> RTPBuffer<'a, Writable> {
"data size should be between 1 and 16 (inclusive"
);
unsafe {
let result: bool = from_glib(gst_rtp_sys::gst_rtp_buffer_add_extension_onebyte_header(
let result: bool = from_glib(ffi::gst_rtp_buffer_add_extension_onebyte_header(
&mut self.rtp_buffer,
id,
data.as_ptr() as glib_sys::gconstpointer,
data.as_ptr() as glib::ffi::gconstpointer,
data.len() as u32,
));
if result {
Ok(())
} else {
Err(glib_bool_error!("Failed to add onebyte header extension"))
Err(glib::glib_bool_error!(
"Failed to add onebyte header extension"
))
}
}
}
@ -159,18 +157,19 @@ impl<'a> RTPBuffer<'a, Writable> {
);
assert!(data.len() < 256, "data size should be smaller than 256");
unsafe {
let result: bool =
from_glib(gst_rtp_sys::gst_rtp_buffer_add_extension_twobytes_header(
&mut self.rtp_buffer,
appbits,
id,
data.as_ptr() as glib_sys::gconstpointer,
data.len() as u32,
));
let result: bool = from_glib(ffi::gst_rtp_buffer_add_extension_twobytes_header(
&mut self.rtp_buffer,
appbits,
id,
data.as_ptr() as glib::ffi::gconstpointer,
data.len() as u32,
));
if result {
Ok(())
} else {
Err(glib_bool_error!("Failed to add twobytes header extension"))
Err(glib::glib_bool_error!(
"Failed to add twobytes header extension"
))
}
}
}
@ -178,37 +177,29 @@ impl<'a> RTPBuffer<'a, Writable> {
impl<'a, T> RTPBuffer<'a, T> {
pub fn get_seq(&self) -> u16 {
unsafe {
gst_rtp_sys::gst_rtp_buffer_get_seq(glib::translate::mut_override(&self.rtp_buffer))
}
unsafe { ffi::gst_rtp_buffer_get_seq(glib::translate::mut_override(&self.rtp_buffer)) }
}
pub fn get_payload_type(&self) -> u8 {
unsafe {
gst_rtp_sys::gst_rtp_buffer_get_payload_type(glib::translate::mut_override(
&self.rtp_buffer,
))
ffi::gst_rtp_buffer_get_payload_type(glib::translate::mut_override(&self.rtp_buffer))
}
}
pub fn get_ssrc(&self) -> u32 {
unsafe {
gst_rtp_sys::gst_rtp_buffer_get_ssrc(glib::translate::mut_override(&self.rtp_buffer))
}
unsafe { ffi::gst_rtp_buffer_get_ssrc(glib::translate::mut_override(&self.rtp_buffer)) }
}
pub fn get_timestamp(&self) -> u32 {
unsafe {
gst_rtp_sys::gst_rtp_buffer_get_timestamp(glib::translate::mut_override(
&self.rtp_buffer,
))
ffi::gst_rtp_buffer_get_timestamp(glib::translate::mut_override(&self.rtp_buffer))
}
}
pub fn get_csrc(&self, idx: u8) -> Option<u32> {
if idx < self.get_csrc_count() {
unsafe {
Some(gst_rtp_sys::gst_rtp_buffer_get_csrc(
Some(ffi::gst_rtp_buffer_get_csrc(
glib::translate::mut_override(&self.rtp_buffer),
idx,
))
@ -220,15 +211,13 @@ impl<'a, T> RTPBuffer<'a, T> {
pub fn get_csrc_count(&self) -> u8 {
unsafe {
gst_rtp_sys::gst_rtp_buffer_get_csrc_count(glib::translate::mut_override(
&self.rtp_buffer,
))
ffi::gst_rtp_buffer_get_csrc_count(glib::translate::mut_override(&self.rtp_buffer))
}
}
pub fn get_marker(&self) -> bool {
unsafe {
from_glib(gst_rtp_sys::gst_rtp_buffer_get_marker(
from_glib(ffi::gst_rtp_buffer_get_marker(
glib::translate::mut_override(&self.rtp_buffer),
))
}
@ -236,9 +225,8 @@ impl<'a, T> RTPBuffer<'a, T> {
pub fn get_payload_size(&self) -> u32 {
unsafe {
gst_rtp_sys::gst_rtp_buffer_get_payload_len(glib::translate::mut_override(
&self.rtp_buffer,
)) as u32
ffi::gst_rtp_buffer_get_payload_len(glib::translate::mut_override(&self.rtp_buffer))
as u32
}
}
@ -248,11 +236,10 @@ impl<'a, T> RTPBuffer<'a, T> {
return Ok(&[]);
}
unsafe {
let pointer = gst_rtp_sys::gst_rtp_buffer_get_payload(glib::translate::mut_override(
&self.rtp_buffer,
));
let pointer =
ffi::gst_rtp_buffer_get_payload(glib::translate::mut_override(&self.rtp_buffer));
if pointer.is_null() {
Err(glib_bool_error!("Failed to get payload data"))
Err(glib::glib_bool_error!("Failed to get payload data"))
} else {
Ok(slice::from_raw_parts(pointer as *const u8, size as usize))
}
@ -261,7 +248,7 @@ impl<'a, T> RTPBuffer<'a, T> {
pub fn get_extension(&self) -> bool {
unsafe {
from_glib(gst_rtp_sys::gst_rtp_buffer_get_extension(
from_glib(ffi::gst_rtp_buffer_get_extension(
glib::translate::mut_override(&self.rtp_buffer),
))
}
@ -270,7 +257,7 @@ impl<'a, T> RTPBuffer<'a, T> {
pub fn get_extension_bytes(&self) -> Option<(u16, glib::Bytes)> {
unsafe {
let mut bits: u16 = 0;
match from_glib_full(gst_rtp_sys::gst_rtp_buffer_get_extension_bytes(
match from_glib_full(ffi::gst_rtp_buffer_get_extension_bytes(
glib::translate::mut_override(&self.rtp_buffer),
&mut bits,
)) {
@ -286,7 +273,7 @@ impl<'a, T> RTPBuffer<'a, T> {
// FIXME: Workaround for gstreamer-rtp-sys having the wrong type for this parameter
let data_ptr = &mut data as *mut *mut u8 as *mut u8;
let mut size: u32 = 0;
let result: bool = from_glib(gst_rtp_sys::gst_rtp_buffer_get_extension_onebyte_header(
let result: bool = from_glib(ffi::gst_rtp_buffer_get_extension_onebyte_header(
glib::translate::mut_override(&self.rtp_buffer),
id,
nth,
@ -308,15 +295,14 @@ impl<'a, T> RTPBuffer<'a, T> {
let data_ptr = &mut data as *mut *mut u8 as *mut u8;
let mut size: u32 = 0;
let mut appbits = 0;
let result: bool =
from_glib(gst_rtp_sys::gst_rtp_buffer_get_extension_twobytes_header(
glib::translate::mut_override(&self.rtp_buffer),
&mut appbits,
id,
nth,
data_ptr,
&mut size,
));
let result: bool = from_glib(ffi::gst_rtp_buffer_get_extension_twobytes_header(
glib::translate::mut_override(&self.rtp_buffer),
&mut appbits,
id,
nth,
data_ptr,
&mut size,
));
if result {
Some((
appbits,
@ -332,7 +318,7 @@ impl<'a, T> RTPBuffer<'a, T> {
impl<'a, T> Drop for RTPBuffer<'a, T> {
fn drop(&mut self) {
unsafe {
gst_rtp_sys::gst_rtp_buffer_unmap(&mut self.rtp_buffer);
ffi::gst_rtp_buffer_unmap(&mut self.rtp_buffer);
}
}
}
@ -353,19 +339,19 @@ impl RTPBufferExt for gst::Buffer {
) -> Result<gst::Buffer, glib::BoolError> {
assert_initialized_main_thread!();
unsafe {
Option::<_>::from_glib_full(gst_rtp_sys::gst_rtp_buffer_new_allocate(
Option::<_>::from_glib_full(ffi::gst_rtp_buffer_new_allocate(
payload_len,
pad_len,
csrc_count,
))
.ok_or_else(|| glib_bool_error!("Failed to allocate new RTP buffer"))
.ok_or_else(|| glib::glib_bool_error!("Failed to allocate new RTP buffer"))
}
}
}
pub fn compare_seqnum(seqnum1: u16, seqnum2: u16) -> i32 {
skip_assert_initialized!();
unsafe { gst_rtp_sys::gst_rtp_buffer_compare_seqnum(seqnum1, seqnum2) }
unsafe { ffi::gst_rtp_buffer_compare_seqnum(seqnum1, seqnum2) }
}
#[cfg(test)]