gstreamer_rtp/
rtp_meta.rs

1// Take a look at the license at the top of the repository in the LICENSE file.
2
3use std::fmt;
4use std::ptr;
5
6use crate::ffi;
7use glib::translate::*;
8use gst::prelude::*;
9
10#[repr(transparent)]
11#[doc(alias = "GstRTPSourceMeta")]
12pub struct RTPSourceMeta(ffi::GstRTPSourceMeta);
13
14unsafe impl Send for RTPSourceMeta {}
15unsafe impl Sync for RTPSourceMeta {}
16
17impl RTPSourceMeta {
18    #[doc(alias = "gst_buffer_add_rtp_source_meta")]
19    pub fn add<'a>(
20        buffer: &'a mut gst::BufferRef,
21        ssrc: Option<u32>,
22        csrc: &[u32],
23    ) -> gst::MetaRefMut<'a, Self, gst::meta::Standalone> {
24        skip_assert_initialized!();
25        unsafe {
26            let meta = ffi::gst_buffer_add_rtp_source_meta(
27                buffer.as_mut_ptr(),
28                ssrc.as_ref()
29                    .map(|ssrc: &u32| ssrc as *const u32)
30                    .unwrap_or(ptr::null()),
31                csrc.as_ptr(),
32                csrc.len() as u32,
33            );
34
35            Self::from_mut_ptr(buffer, meta)
36        }
37    }
38
39    #[inline]
40    pub fn ssrc(&self) -> Option<u32> {
41        unsafe {
42            if from_glib(self.0.ssrc_valid) {
43                Some(self.0.ssrc)
44            } else {
45                None
46            }
47        }
48    }
49
50    #[inline]
51    pub fn csrc(&self) -> &[u32] {
52        &self.0.csrc[0..self.0.csrc_count as usize]
53    }
54
55    #[doc(alias = "gst_rtp_source_meta_set_ssrc")]
56    #[inline]
57    pub fn set_ssrc(&mut self, ssrc: Option<u32>) {
58        unsafe {
59            ffi::gst_rtp_source_meta_set_ssrc(
60                &mut self.0,
61                mut_override(
62                    ssrc.as_ref()
63                        .map(|ssrc: &u32| ssrc as *const u32)
64                        .unwrap_or(ptr::null()),
65                ),
66            );
67        }
68    }
69
70    #[inline]
71    #[doc(alias = "gst_rtp_source_meta_append_csrc")]
72    pub fn append_csrc(&mut self, csrc: &[u32]) -> Result<(), glib::BoolError> {
73        unsafe {
74            let res: bool = from_glib(ffi::gst_rtp_source_meta_append_csrc(
75                &mut self.0,
76                csrc.as_ptr(),
77                csrc.len() as u32,
78            ));
79
80            if res {
81                Ok(())
82            } else {
83                Err(glib::bool_error!("Failed adding another CSRC"))
84            }
85        }
86    }
87}
88
89unsafe impl MetaAPI for RTPSourceMeta {
90    type GstType = ffi::GstRTPSourceMeta;
91
92    #[doc(alias = "gst_rtp_source_meta_api_get_type")]
93    #[inline]
94    fn meta_api() -> glib::Type {
95        unsafe { from_glib(ffi::gst_rtp_source_meta_api_get_type()) }
96    }
97}
98
99impl fmt::Debug for RTPSourceMeta {
100    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
101        f.debug_struct("RTPSourceMeta")
102            .field("ssrc", &self.ssrc())
103            .field("csrc", &self.csrc())
104            .finish()
105    }
106}