linphone eventqueue

linphone 有个全局的事件处理机制,叫MSEventQueue,他的核心思想是linphone内核提供一个event queue,每个filter可以注册自己的事件回调处理函数到这个eventqueue,而linphone的迭代线程里会读取并处理这些事件。

 

1.初始化

static void linphone_core_init(){
 ...
 lc->msevq=ms_event_queue_new();
 ms_set_global_event_queue(lc->msevq);
 ...
}

在linphone内核初始化的时候,会新建一个eventqueue,并保存在全局变量里面。

 

2.注册事件以及处理函数

int video_stream_start (){
 ms_filter_set_notify_callback(stream->ms.decoder, event_cb, stream);
}

在视频流初始化函数里为解码filter注册了回调函数。

static void dec_process(MSFilter *f){
 ms_filter_notify_no_arg(f,MS_VIDEO_DECODER_DECODING_ERRORS);
}

在视频H264解码的fiter里,如果检测到解码失败,会向eventqueue发一个消息,并继续往下走。

3.处理event

void linphone_core_iterate(LinphoneCore *lc){
 if (lc->msevq)ms_event_queue_pump(lc->msevq);
}

在linphone的迭代线程里会处理所有的消息,处理方法是调用该消息对应的回调函数,此消息的回调里面会发一个sip消息告知对方,解码端解码失败,需要一个IDR帧。

 

4.释放eventqueue
static void linphone_core_uninit(LinphoneCore *lc){
 ms_event_queue_destroy(lc->msevq);
 lc->msevq=NULL;
}

linphone内核释放的时候才会释放eventqueue。

 

综述所述,eventqueue提供了一个 filter全局事件的处理方式。如果不使用eventqueue,而在filter内部处理这些消息,是否可行呢?

从功能实现层面来说是可以的,一样可以实现所需要的功能。但是从软件方案设计和模块化的角度来说,eventqueue是需要的,他使得

代码逻辑更清晰,结构划分更合理。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值