Skip to main content

gstreamer_pbutils/
discoverer_subtitle_info.rs

1// Take a look at the license at the top of the repository in the LICENSE file.
2
3use std::fmt;
4
5use glib::prelude::*;
6
7use crate::{DiscovererStreamInfo, DiscovererSubtitleInfo};
8
9#[cfg(feature = "v1_30")]
10use glib::translate::*;
11
12#[cfg(feature = "v1_30")]
13use crate::ffi;
14
15pub struct Debug<'a>(&'a DiscovererSubtitleInfo);
16
17impl fmt::Debug for Debug<'_> {
18    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
19        let info = self.0.upcast_ref::<DiscovererStreamInfo>();
20
21        f.debug_struct("DiscovererSubtitleInfo")
22            .field("language", &self.0.language())
23            .field("stream", &info.debug())
24            .finish()
25    }
26}
27
28impl DiscovererSubtitleInfo {
29    pub fn debug(&self) -> Debug<'_> {
30        Debug(self)
31    }
32
33    #[cfg(feature = "v1_30")]
34    #[cfg_attr(docsrs, doc(cfg(feature = "v1_30")))]
35    #[doc(alias = "gst_discoverer_subtitle_info_builder_new")]
36    pub fn builder(stream_id: &str, caps: &gst::Caps) -> DiscovererSubtitleInfoBuilder {
37        skip_assert_initialized!();
38
39        DiscovererSubtitleInfoBuilder::new(stream_id, caps)
40    }
41}
42
43/// Opaque structure for building [`DiscovererSubtitleInfo`][crate::DiscovererSubtitleInfo] objects programmatically.
44#[cfg(feature = "v1_30")]
45#[cfg_attr(docsrs, doc(cfg(feature = "v1_30")))]
46#[derive(Debug)]
47#[doc(alias = "GstDiscovererSubtitleInfoBuilder")]
48#[repr(transparent)]
49pub struct DiscovererSubtitleInfoBuilder(std::ptr::NonNull<ffi::GstDiscovererSubtitleInfoBuilder>);
50
51#[cfg(feature = "v1_30")]
52#[cfg_attr(docsrs, doc(cfg(feature = "v1_30")))]
53impl DiscovererSubtitleInfoBuilder {
54    /// Creates a new [`DiscovererSubtitleInfoBuilder`][crate::DiscovererSubtitleInfoBuilder].
55    /// ## `stream_id`
56    /// the stream ID
57    /// ## `caps`
58    /// the subtitle caps
59    ///
60    /// # Returns
61    ///
62    /// a new [`DiscovererSubtitleInfoBuilder`][crate::DiscovererSubtitleInfoBuilder]
63    #[doc(alias = "gst_discoverer_subtitle_info_builder_new")]
64    pub fn new(stream_id: &str, caps: &gst::Caps) -> Self {
65        skip_assert_initialized!();
66
67        unsafe {
68            let ptr = ffi::gst_discoverer_subtitle_info_builder_new(
69                stream_id.to_glib_none().0,
70                caps.to_glib_none().0,
71            );
72            DiscovererSubtitleInfoBuilder(std::ptr::NonNull::new_unchecked(ptr))
73        }
74    }
75
76    #[doc(alias = "gst_discoverer_subtitle_info_builder_set_language")]
77    pub fn language(self, language: &str) -> Self {
78        unsafe {
79            ffi::gst_discoverer_subtitle_info_builder_set_language(
80                self.0.as_ptr(),
81                language.to_glib_none().0,
82            );
83        }
84        self
85    }
86
87    #[doc(alias = "gst_discoverer_subtitle_info_builder_set_tags")]
88    pub fn tags(self, tags: &gst::TagList) -> Self {
89        unsafe {
90            ffi::gst_discoverer_subtitle_info_builder_set_tags(
91                self.0.as_ptr(),
92                tags.to_glib_none().0,
93            );
94        }
95        self
96    }
97
98    /// Builds and returns a new [`DiscovererSubtitleInfo`][crate::DiscovererSubtitleInfo]. This frees the builder.
99    ///
100    /// # Returns
101    ///
102    /// a new [`DiscovererSubtitleInfo`][crate::DiscovererSubtitleInfo]
103    #[doc(alias = "gst_discoverer_subtitle_info_builder_build")]
104    pub fn build(self) -> DiscovererSubtitleInfo {
105        unsafe {
106            // gst_discoverer_subtitle_info_builder_build frees the builder,
107            // so prevent it from being dropped at the end of this scope/function
108            let s = std::mem::ManuallyDrop::new(self);
109
110            from_glib_full(ffi::gst_discoverer_subtitle_info_builder_build(
111                s.0.as_ptr(),
112            ))
113        }
114    }
115}
116
117#[cfg(feature = "v1_30")]
118#[cfg_attr(docsrs, doc(cfg(feature = "v1_30")))]
119impl Drop for DiscovererSubtitleInfoBuilder {
120    #[inline]
121    #[doc(alias = "gst_discoverer_subtitle_info_builder_free")]
122    fn drop(&mut self) {
123        unsafe {
124            ffi::gst_discoverer_subtitle_info_builder_free(self.0.as_ptr());
125        }
126    }
127}
128
129#[cfg(test)]
130mod tests {
131    #[test]
132    #[cfg(feature = "v1_30")]
133    fn discoverer_subtitle_info_builder_basic() {
134        use std::str::FromStr;
135
136        use super::*;
137
138        use crate::traits::DiscovererStreamInfoExt;
139
140        gst::init().unwrap();
141
142        let caps = gst::Caps::from_str("text/x-raw, format=utf8").unwrap();
143
144        let mut tags = gst::TagList::new();
145        tags.get_mut()
146            .unwrap()
147            .add::<gst::tags::Title>(&"some title", gst::TagMergeMode::Append);
148
149        let info = DiscovererSubtitleInfoBuilder::new("subtitle_builder_test", &caps)
150            .language("en")
151            .tags(&tags)
152            .build();
153
154        assert_eq!(info.language(), Some(glib::GString::from("en")));
155        assert_eq!(
156            info.tags()
157                .unwrap()
158                .get::<gst::tags::Title>()
159                .unwrap()
160                .get(),
161            "some title"
162        );
163    }
164}