基于Blackfin 533的SIP网络电话
通话的Offer或Answer会话确立之后(即协商已经完成,双方确定了通信的类型),根据通话双方的SDP信息,就创建出来一个Media Session Info结构。接着SIP信令交互线程会创建一个Media Session(多媒体会话)结构。在这一过程中,按照在Me dia sessionInfo数据结构中的codec等设置信息,Media Stream被创建出来。与此同时,Media Stream和先前创建的MediaTransport也被连接到了一起。该Media Stream对象将以Port的形式注册到Conference Bridge。接着在Confer-ence Bridge中注册的Media Stream Port会根据需要被连接到其他Port,从而实现语音数据的传送。比如,将一个Media Stream Port和Sound Device Port相连,就可以实现语音的播放和采集。
RTP/RTCP数据包的接收并不包含在以上介绍的流程之中,而是由RTP/RTCP收发线程来负责的。这是通过将RTP和RTCP的Sockets注册到一个IOQueue队列中,然后通过select()来完成的。首先,Media Transport会将其Socket注册到一个在初始化过程中创建的I0Queue上。RTP/RTCP收发线程会轮询这个IOQueue,当一个RTP数据报被检测到之后,轮询函数会触发on_rx_rtp()函数调用。这个回调函数是在一开始Socket注册的时候被Media Transport一同注册到了IOQueue上的。接着on_rx_rtp()会将收到的RTP数据包传递给Mediastream Port。Media Stream会将收到的RTP解包,更新相关统计数据,并将负载中的音频数据放到Jitter Buffer中。RTP包的接收到这里就结束了,放到Jitter Buffer中的数据会被Codec语音线程处理。RTCP的接收过程与此类似,只不过RTCP并不传输语音,而是提供语音传输方面的信息。根据这些信息,应用可以对会话作出动态调整,从而提高通话的质量。
整个音频流都是由Codec语音线程来驱动的,具体来说是声卡的回调函数。
当声卡设备需要新的一帧数据播放到扬声器时,回调函数play_cb()就会被调用。接着Sound Device Port就会调用get_frame()函数,这会触发Conference Bridge调用另外的get_frame()去收集在其注册的所有Port的媒体流数据。Conference Bridge对Media Stream Port的一次get_frame()调用,会使得Media Stream Port从JitterBuffer中取出一个数据帧,按照配置好的Codec将其解码(如果有包丢失,就会进行Packet Lost Concealment/PLC),并将解码后的PCM数据帧传递给调用者。如果有必要,会将收集到的信号混合(比如多方通话),然后再将信号发送到它的目的Port,从而完成音频数据在Port之间的传递(不单单是播放流程,这个过程对声音的采集也是很重要的,因为只有这个过程可以完成数据在Port之间的交换)。之后,Conference Bridge会把声卡设备需要的数据发送到Sound Device Port。
当声卡设备完成了一帧数据的采集后,它就会调用rec_cb()回调函数。这将会导致Conference Bridge的put_frame()函数调用。put_frame()函数调用会将PCM数据帧保存在一个内部的缓冲队列中,当下次ConferenceBridge轮询Port时,这些数据将会被传递给目的Port。该Media Stream Port会将这个PCM数据帧按照配置好的codec进行编码,然后将其封装为RTP数据报,更新RTCP,然后将RTP/RTCP数据报传递给与其相连的Media Transport,最后Media Transport就会将数据报发送到网络。数据流框图如图4所示。
4 功能测试
4.1 测试环境
为了验证这部网络电话的功能,我们搭建了一个实验环境。这个实验环境包括:
① 一台单独的主机运行SER(SIP Express Router),来实现服务器的功能,包括注册服务器、重定向服务器和代理服务器等SIP逻辑上的实体;
② 运行X-Lite的主机,用来作为远端客户机,和网络电话处于对等的状态,用来进行呼叫、接受呼叫等功能性实验;
③ Blackfin网络电话,以下简称为"BF533网络电话"。
它们都以以太网的方式接入同一个局域网中。实验环境的示意图如图5所示。Ethereal是本次实验中用到的监听工具。
4.2 界面简介
用户界面如图6所示。
靠近显示区的顶端是音量显示区。小图标指明了显示音量的种类;音量显示采用递增柱体,分为6级。紧挨着音量显示区的是状态显示区。这部分包括Server状态信息显示区、Call状态信息显示区、当前通话状态信息显示区和号码输入显示区。底部是菜单显示区。从左到右分别为:选择上一通话、选择下一通话、呼叫转接、呼叫保持、增大麦克音量、减小麦克音量、增大扬声器音量、减小扬声器音量、电话会议。
4.3 功能测试
(1)注册
注册过程如图7所示。BF533网络电话和SER服务器共交换了两条消息
- 日立公司采用ADI的高性能Blackfin处理复杂算法及繁重I/O负载(01-16)
- Blackfin助您无线IP视频监控的应用(06-24)
- 基于Blackfin DSP的液晶接口设计(01-04)
- 基于ADSP-BF561的H.264视频编码器的实现(01-10)
- 基于ADSP-BF561处理器的视频编码器平台(01-16)
- ADI Blackfin?处理器架构概述 (07-12)