gstreamer_pbutils/
discoverer_subtitle_info.rs1use 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#[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 #[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 #[doc(alias = "gst_discoverer_subtitle_info_builder_build")]
104 pub fn build(self) -> DiscovererSubtitleInfo {
105 unsafe {
106 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}