gstreamer-rs/gstreamer-rtp/src/rtp_meta.rs
Bilal Elmoussaoui 4ebec84f5e Adapt to no longer renamed ffi crates
Allows us to set all the crates in the main workspace file, so changing
their versions or branch is much simpler and reduce the amount of noise
in the diff

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/-/merge_requests/1450>
2024-06-02 11:20:55 +02:00

106 lines
2.8 KiB
Rust

// Take a look at the license at the top of the repository in the LICENSE file.
use std::fmt;
use std::ptr;
use crate::ffi;
use glib::translate::*;
use gst::prelude::*;
#[repr(transparent)]
#[doc(alias = "GstRTPSourceMeta")]
pub struct RTPSourceMeta(ffi::GstRTPSourceMeta);
unsafe impl Send for RTPSourceMeta {}
unsafe impl Sync for RTPSourceMeta {}
impl RTPSourceMeta {
#[doc(alias = "gst_buffer_add_rtp_source_meta")]
pub fn add<'a>(
buffer: &'a mut gst::BufferRef,
ssrc: Option<u32>,
csrc: &[u32],
) -> gst::MetaRefMut<'a, Self, gst::meta::Standalone> {
skip_assert_initialized!();
unsafe {
let meta = ffi::gst_buffer_add_rtp_source_meta(
buffer.as_mut_ptr(),
ssrc.as_ref()
.map(|ssrc: &u32| ssrc as *const u32)
.unwrap_or(ptr::null()),
csrc.as_ptr(),
csrc.len() as u32,
);
Self::from_mut_ptr(buffer, meta)
}
}
#[inline]
pub fn ssrc(&self) -> Option<u32> {
unsafe {
if from_glib(self.0.ssrc_valid) {
Some(self.0.ssrc)
} else {
None
}
}
}
#[inline]
pub fn csrc(&self) -> &[u32] {
&self.0.csrc[0..self.0.csrc_count as usize]
}
#[doc(alias = "gst_rtp_source_meta_set_ssrc")]
#[inline]
pub fn set_ssrc(&mut self, ssrc: Option<u32>) {
unsafe {
ffi::gst_rtp_source_meta_set_ssrc(
&mut self.0,
mut_override(
ssrc.as_ref()
.map(|ssrc: &u32| ssrc as *const u32)
.unwrap_or(ptr::null()),
),
);
}
}
#[inline]
#[doc(alias = "gst_rtp_source_meta_append_csrc")]
pub fn append_csrc(&mut self, csrc: &[u32]) -> Result<(), glib::BoolError> {
unsafe {
let res: bool = from_glib(ffi::gst_rtp_source_meta_append_csrc(
&mut self.0,
csrc.as_ptr(),
csrc.len() as u32,
));
if res {
Ok(())
} else {
Err(glib::bool_error!("Failed adding another CSRC"))
}
}
}
}
unsafe impl MetaAPI for RTPSourceMeta {
type GstType = ffi::GstRTPSourceMeta;
#[doc(alias = "gst_rtp_source_meta_api_get_type")]
#[inline]
fn meta_api() -> glib::Type {
unsafe { from_glib(ffi::gst_rtp_source_meta_api_get_type()) }
}
}
impl fmt::Debug for RTPSourceMeta {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.debug_struct("RTPSourceMeta")
.field("ssrc", &self.ssrc())
.field("csrc", &self.csrc())
.finish()
}
}