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是需要的,他使得
代码逻辑更清晰,结构划分更合理。