GStreamer Bus的一个细节

GStreamer的Bus系统主要用于向用户提供内部Elements的事件信息。使用GStreamer的Bus系统,只要调用gst_bus_add_watch,并且注册一个Callback即可。但问题在于调用这个接口的时机,及用于处理Bus事件的线程。Callback内部以glib的Source机制实现,Source要attach到一个GMainContext上,且需要有一个GMainloop来侦听这个Context。通常,调用gst_bus_add_watch的线程,在未做过任何处理的情况下,这个Source attach的GMainContext是NULL,也就是Default Main Context。而侦听Default Main Context的线程未必就是调用者线程,这样在做资源回收时,会出现多线程互斥问题。

需要回调函数在调用者线程中执行的方法如下:

1. 在创建调用者线程之后,创建该线程自己的GMainContext与GMainloop,然后调用g_main_context_push_thread_default,将该Context作为线程自己的默认Context,并使用GMainloop侦听;

2. 之后再在该线程中调用gst_bus_add_watch,则Callback会在调用者线程中执行,避免了多线程互斥的问题。

此方法同时避免了应用的主线程负担过重的问题。另外,所有基于gio的应用,也会由于使用了g_main_context_push_thread_default,使得各线程的负载分散化。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值