摘要:DM642是美国的TI公司针对数字视频和图像应用设计的一款高性能数字信号处理器;NDK(Network Developer’s Kit)是在DSP上进行网络协议开发的工具包。本文研究了NDK在DM642上的具体应用,并以MPEG2编解码库为基础,开发了一个基于TCP/IP协议的模块化的网络视频传输系统。此系统软件框架具有结构灵活、易于升级等特点,可应用于各类视频压缩标准的网络。
关键词:DM642;NDK;MPEG2;RF5;视频传输
近年来,信源编码技术有了长足的进步,形成了新一代的技术标准,如H.264,AC-1等,为音视频服务提供了新的发展空间。另一方面,TCP/IP协议逐渐成为视频传输网络的主流。TI 公司针对视频和图像应用推出了数字媒体处理器DM642。该芯片内部时钟高达600MHZ,最大处理能力达到4800MIPS。在音视频方面,集成了3个可配置的视频端口(VP),多通道音频串口。在网络接入方面,DM642集成了10/100Mbps的以太网MAC,适用于开发以太网多媒体通信设备。本文通过开发一个基于TCP/IP的模块化的网络视频传输系统,重点讨论了NDK在DM642上的应用问题。
1 NDK和RF5简介
TI的集成开发环境中的实时操作系统是DSP/BIOS,它并不包含网络功能。为了解决这个问题,TI结合其C6000系列推出了NDK(Network Developer’s Kit),该开发包可以用较少的资源消耗支持TCP/IP。NDK仅用200~250kB程序空间和95kB数据空间即可支持常规的TCP/IP服务,包括应用层的telnet,DHCP,HTTP等。所以,NDK很适合目前嵌入式系统的硬件环境,是实现DSP上网的重要支撑工具。
软件参考框架(Reference Framework)是TI为使用DSP/BIOS和TMS320DSP算法标准的应用开发者提供的。参考框架有不同的版本,其中RF5适合在C6000系列DSP上使用多任务、多通道和多算法来开发较复杂的应用。RF5包括4种元素:任务(Task)、通道(Channel)、单元(Cell)和算法(Algorithm)。算法是最基本的元素,每一个算法完成一项特定的工作,然后按XDIAS算法规范封装成一个单元,一个或多个单元注册进通道后,在通道里按一定的顺序执行。一个任务中可以放入一个或多个通道,以实现特定的应用。
下面就用一个具体的实例说明如何在DM642上利用NDK实现一个简易的视频传输系统。硬件平台是TI的DM642EVM,软件环境是CCS 2.20.18。
2 视频传输系统的软件架构
TI公司为DM642EVM提供了例程mpeg2_loopback,集成了MPEG2编码和解码库。它使用RF5,运行三个任务:输入任务,处理任务和输出任务。它们的优先级是相同的,为避免发生资源抢占的情况,任务之间用SCOM进行同步和通信。输入任务从NTSC输入设备中获取帧,转换成YUV4:2:0格式,然后向处理任务发SCOM_message,在message中包含帧的地址;处理任务把帧进行MPEG2编码,然后把比特流传给解码通道进行解码,再传给输出任务;输出任务将帧转换成YUV4:2:2的格式后在NTSC输出设备上显示,然后向输入任务发一个SCOM_message,告诉它可以继续采集下一帧。三个任务用SCOM_message构成一个回环(loopback)。如图1所示。
3 网络传输模块开发
上述例程把编码和解码都放在TskVideoProcess中,通常用来演示。实际应用中编码和解码往往在不同的地方,比如视频监控,一端采集图像、编码、通过以太网或其他方式发出去,另一端接收下来进行解码,输出显示。因此有必要把编码和解码分开,然后添加网络。
3.1 将编码和解码分开
把原来的“处理任务”分成“编码任务”和“解码任务”。输入任务和编码任务用一对SCOM消息通信。输入完成后发一个SCOM消息给编码任务,消息中包含帧的指针。编码任务开始工作,完成后再通知输入模块。由于编码前的帧和编码以后的帧放在不同的内存区域,这样就保证不会出现内存读写冲突的情况。同理,解码模块和输出模块也利用一对SCOM消息通信。如图2所示。
下面截取编码任务tskEncode.c中的代码来说明SCOM的用法。
ScomBufChannels *pMsgBuf;
ScomBufChannels scomBufMessage;
while (1) {
//等待输入任务的消息,如果没来则一直等下去
pMsgBuf = SCOM_getMsg (fromInputtoEnc, SYS_FOREVER);
………. //编码
//编码完毕,将SCOM还给输入任务,使其继续采集视频
SCOM_putMsg (fromEnctoInput, pMsgBuf);
//编好的数据流存在bitBuf里面,将这个地址放在SCOM中
scomBufMessage.bufChannel = bitBuf;
//向网络发送模块发消息,消息中含有编好的文件地址
SCOM_putMsg (fromEnctoNet, &scomBufMessage);
//等待网络发送模块送回SCOM,如果没送回就一直等下去
SCOM_getMsg (fromNettoEnc, SYS_FOREVER);
}
3.2 添加网络发送任务和接收任务
在BIOS里创建一个静态的任务,取名network_main。在network_main()里打开系统,配置好IP和子网掩码,然后创建一个动态的任务,完成数据的发送或接收。假设发送函数名为taskNetworkTx,任务优先级是5,创建的语句是:hSend = TaskCreate (tskNetworkTx, "NetTx", 5, 0x2000, 0, 0, 0);接收端为tskNetworkRx,创建的语句是:hRecv = TaskCreate (tskNetworkRx, "NetRx", 5, 0x2000,
0, 0, 0);tskNetworkTx和tskNetworkRx两个函数内部是具体的套接口(socket)编程,根据实际需要可以采用TCP或UDP协议。以发送端为例,采用UDP协议,代码如下:
void tskNetworkTx () {
……...//声明socket,打开SCOM
//打开任务
fdOpenSession (TaskSelf ());
//sudp是数据报套接口
sudp = socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP);
//配置目标IP地址和端口号
bzero (&sin1, sizeof (struct sockaddr_in));
sin1.sin_family = AF_INET;
sin1.sin_len = sizeof( sin1 );
sin1.sin_port = htons (7);
sin1.sin_addr.s_addr = inet_addr ("192.168.0.7");
for ( ; ;){
//等待编码器将数据指针发送过来
pMsgBuf = SCOM_getMsg (EnctoNet, SYS_FOREVER);
//将数据指针存到mpg_buf里
mpg_buf = pMsgBuf->bufChannel;
//发送以mpg_buf开始的1KB数据
sendto (sudp, (UINT8 *) mpg_buf, 1000, 0, &sin1, sizeof (sin1));
//将SCOM还给编码器
SCOM_putMsg (NettoEnc, pMsgBuf);
}
}
添加网络收发模块后的系统流程如图3所示。
4 总结与展望
本视频传输系统在DM642EVM上调试、运行通过,实现了MPEG2实时视频压缩/解压缩和以太网络传输等功能。当前在以DSP为硬件环境的系统中应用TCP/IP协议已成为开发热点。随着新一代视频压缩标准的普及,以及以数字机顶盒为代表的网络流媒体的广泛应用,集成了网络模块的视频处理芯片必将拥有更广阔的应用前景。
本文作者创新点:以一个具体实例——MPEG2视频传输系统说明了NDK的应用过程以及需要注意的问题,列出了部分重要的代码,并做了详细的说明,对在TI DSP上进行网络模块的开发具有重要的借鉴意义。