gstreamer_rtp/
rtp_meta.rs
1use 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}