gpt4 book ai didi

rust - 在 Rust 中,有没有办法对 `gstreamer::Bin` 进行子类化,这样我仍然拥有它的原始方法?

转载 作者:行者123 更新时间:2023-12-03 11:44:50 31 4
gpt4 key购买 nike

我正在尝试子类 gstreamer::Bin覆盖其Bin::handle_message方法,目的是拦截流尾消息,丢弃它们并发出信号表明它们已被丢弃(如果它们不是流尾消息,则使用默认的 Bin::handle_message 行为)。
问题是,我仍然需要它的原始方法(如 Bin::addBin::add_pad 等),因为我需要堆叠在原始 gstreamer::Bin 之上的唯一行为就是前面提到的消息拦截。
我提到我仍然需要它的原始方法,因为当我尝试遵循 this 时例如,生成的 CustomBin我写的不满足IsA<Bin> ,因此不符合 gstreamer::GstBinExt 的全面实现条件。 ,这反过来又使它没有原始的 gstreamer::Bin方法。
我也遇到了this例如,但最终我不想为要从管道中动态添加和删除的每组元素重新实现消息拦截行为。我也不需要将它注册为适当的元素,我只需要在我自己的 crate 和其中定义的管道中使用它。
作为引用,我将附上我实现这一目标的尝试。
我错过了什么?

pub struct CustomBin {
eos_guard: Mutex<Option<Sender<()>>>,
}

impl Default for CustomBin {
fn default() -> Self {
Self {
eos_guard: Mutex::new(None),
}
}
}

impl ObjectImpl for CustomBin {
glib_object_impl!();
}

impl ElementImpl for CustomBin {}

impl BinImpl for CustomBin {
fn handle_message(&self, bin: &Bin, message: Message) {
if let MessageView::Eos(_) = message.view() {
if let Some(sender) = self.eos_guard.lock().unwrap().take() {
sender.send(()).unwrap_or(());
} else {
self.parent_handle_message(bin, message);
}
} else {
self.parent_handle_message(bin, message);
}
}
}

impl ObjectSubclass for CustomBin {
const NAME: &'static str = "GstCustomBin";
type ParentType = Bin;
type Instance = ElementInstanceStruct<Self>;
type Class = ClassStruct<Self>;

glib_object_subclass!();

fn new() -> Self {
Self::default()
}
}

impl CustomBin {
pub fn install_eos_guard(&self) -> Receiver<()> {
let mut eos_guard = self.eos_guard.lock().unwrap();
let (sender, receiver) = channel();

if eos_guard.is_some() {
panic!("End-of-stream guard was already installed");
} else {
eos_guard.replace(sender);
}

receiver
}
}

最佳答案

您的 CustomBin struct 是类型的内部实现,而不是 glib::Object (或 gst::Bin )本身。如果将其与例如Java 那么这就是所有私有(private)字段和 protected 虚拟方法。
这足以创建一个新实例并将其用作其任何父类

let obj: glib::Object = glib::Object::new(CustomBin::get_type(), &[("name", "bla")]).unwrap();
let bin: gst::Bin = obj.downcast::<gst::Bin>().unwrap();
请注意 objbin以上不是你的 CustomBin结构。
围绕您的 CustomBin 创建公共(public) Rust API你会使用 glib_wrapper! 宏。你可以找到一个例子 here .不要只看那些突出显示的行,还要看上面的所有代码。

关于rust - 在 Rust 中,有没有办法对 `gstreamer::Bin` 进行子类化,这样我仍然拥有它的原始方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63569078/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com