《1   引言》

1   引言

在诸如运动目标估计、视频压缩编解码等视频处理领域中,由于处理的数据量大、算法复杂度高,因此处理的实时性往往成为困扰技术人员的难题。如果采用专用算法芯片来实现,虽然实时性得到保证,但系统的灵活性大大降低。为此,寻求一种高速的通用数字信号处理芯片成为解决问题的主要方法。在这种情况下,多媒体处理器 TMS320DM642[1] (DM642)应运而生, DM642 以其丰富的外设接口和高速的处理能力使基于其设计出的产品在图像质量、硬件成本、灵活性等方面都优于专门的视频编解码芯片。笔者介绍一种基于 DM642 芯片、可以实现 4 路视频图像的实时采集与回放的实时视频处理系统。

《2   DM642 多媒体处理器》

2   DM642 多媒体处理器

数字多媒体处理器 DM642 是 TI 公司于 2002 年推出的一款专门为数字媒体应用而设计开发的 32 位定点 DSP 芯片,该芯片采用基于 C64X 的 DSP 内核,工作频率最高达720 MHz ,处理性能可达5 760 MI/s 。 DM642 具有256 kB的二级缓存和 64 通道 EDMA 的 EDMA 控制器,并配有大量外围设备和接口。

DM642 上集成了 3 个视频口[2] (VP 口),每个VP 口可分为 A 和 B 两个通道,每个通道都可被配置为视频输入口或者视频输出口,但是 A,B 两个通道只能同时被配置为输入口或同时被配置为输出口。 VP 口的功能配置是由 DM642 上的外设配置寄存器 PERCFG (位置为 0x01B3F00)完成的。考虑到需要有一个 VP 口作为输出口,所以 DM642 最多支持 4 路视频输入。

《3   系统介绍》

3   系统介绍

系统实现了 4 通道的视频采集,并通过显示屏同时回放 4 路视频图像。系统框图如图 1 所示。

《图 1》

图 1 系统框图

Fig.1 System black diagram

《3.1 硬件部分》

3.1 硬件部分

3.1.1   视频解码器系统选用图像解码芯片TVP5150[3] 来完成视频图像的 A/D 转换以及对水平同步和垂直同步等信号的分离。超低功耗的视频解码芯片 TVP5150 ,采用 32 引脚的 TQFP 封装,正常工作时功耗只有 115 mW ,可将 NTSC , PAL 或 SECAM 视频信号转换为数字分量视频信号。在系统中, TVP5150 将 PAL 制的模拟视频信号转换为 8 b 的 ITU - R BT.656 格式、 4∶2∶2 的视频数据流发送到 DM642 的 VP 口,如图 2 中所示。

《图 2》

图 2 TVP5150 的连接示意图

Fig.2 TVP5150 black diagram

TVP5150 的视频输出口 D [7 — 0]和 DM642 的 VP 口 D [9 — 2]相连,由于采用了 ITU - R BT.656 格式,图像的行同步和场同步信号均内嵌在视频数据流内,所以不需要另外连接同步信号线。

TVP5150 用系统时钟提供采样时钟,用可编程输出引脚 GPCL 提供采样使能信号,故将时钟线 SCLK 与 DM642 VP 口的 VP- CLK 相接, GPCL 引脚与 VP 口的 VP- CTL 相接。系统采用复合视频信号输入格式, CVBS/Y 作为复合视频输入, CVBS/C 作为模拟地。由于 TVP5150 的视频输入电压峰值为 0.75 V ,而 CCD 摄像头输出的电压峰值一般为 1 V ,所以需在外部视频输入与 TVP5150 的视频输入之间串接一个到地的分压电阻网络,以达到 TVP5150 的所需输入电平。如图 2 所示。

系统将 DM642 的 VP1 口和 VP2 口用作视频输入口,每个视频口连接 2 路视频信号,共接入 4 路视频信号, VP0 口用作视频输出。每一路视频信号都需要单独的视频解码芯片,所以系统需要 4 片 TVP5150 。 DM642 对 TVP5150 的配置是通过 I2C 总线实现的, TVP5150 作为从设备,最多可配置 2 个从地址 0xBA 和 0xB8 ,所以 DM642 用 1 路 I2C 总线只能同时访问 2 个 TVP5150 配置口,无法实现 4 片 TVP5150 的控制。因此,系统用 SN74CBT3257 作 I2C 总线切换,使用 DM642 的通用 I/0 口 GP0 来控制切换,当 GP0 为“0”时,选通第一路和第二路视频通路的 TVP5150 ,当 GP0 为“1”时,选通第三路和第四路视频通路的 TVP5150 。如图 3 所示。

《图 3》

图 3 编解码器的 I2C 总线配置

Fig.3 Codec I2C configuration

3.1.2   视频编码器系统选用 Philips 公司的 SAA7121[4]作为视频编码器,其输入为标准的 8 b BT.656 数字视频数据流,输出为 PAL 制复合视频 CVBS 信号。与 TVP5150 一样, SAA7121 也使用 I2C 总线来设置工作参数和反馈状态信息,也只能作为从设备,其地址需根据 SA 管脚的状态进行配置,系统中设为 0x88 。 I2C 总线的连接见图 3 。 SAA7121 支持寄存器的地址自动加 1 的功能,除了可读的状态寄存器外,其他的寄存器只写。 SAA7121 接在 VP0 口的 A 通道上, VP0 口作为视频输出口,必须要为视频编码器 SAA7121 提供视频时钟和行、场同步信号。 VP0 口的 B 通道可配置为 MCASP 或 MCBSP ,留做扩展功能之用。

3.1.3   VP0 口的功能实现 DM642 的视频口作为输入或输出口,均可支持 8/10 位的 ITU - R BT.656 格式、 16/20 b 的 Y/C 格式, 8/10/16/20 b 的 raw 格式等多种视频格式。系统中, DM642 视频口的输入和输出均采用 8 b 的 ITU - R BT.656 格式。

1)视频数据流输入实现

系统中, 8 b 的 ITU - R BT.656 数据流进入 VP 口后,经由 BT.656 捕获通道,进入到视频口缓冲区中。如图 4 所示。

《图 4》

图 4 VP 口 BT.656 视频输入缓冲区结构

Fig.4 Video port BT.656 video capture FIFO configuration

每个视频口都有一个5 120 B的视频输入/输出缓冲区[2] 。当视频口作为输入口时,缓冲区按照 A ,B 2 个通道分成 2 个2 560 B 的缓冲区,每个通道的缓冲区又分为 Y 缓冲区(1 280 B)、 Cb 缓冲区(640 B)和 Cr 缓冲区(640 B)。每个缓冲区分别对应着一个只读的存储器映射寄存器(YSRCx , CBSRCx 和 CRSRCx )。视频通道缓冲区接收到数据后将其打包成64 b 的双字,送入寄存器等待传输。

DM642 通过 EDMA 事件实现视频口缓冲区和片内 L2 存储器之间的数据传递,用户需要编程设定一个缓冲区阈值用以产生 EDMA 事件。 BT.656 格式的数据流按照 Cb0,Y0,Cr0,Y1,Cb2,Y2,Cr2,Y3,Cb4,Y4,Cr4,Y5,…的串行传输顺序,经由 BT656 捕获通道分别进入到各自的缓冲区中并打包成 64 b 的双字,当双字增至缓冲区阈值时,则触发 EDMA 事件,存储器映射寄存器即作为 EDMA 数据传输的源地址。缓冲区的阈值是可以编程设定的,对于视频输入模式,其首选是一行的数据量,或为 1/2 行或 1/4 行。为了保证每一场的数据能够全部传完且没有遗漏,每次 EDMA 传输的数据的大小应等同于该阈值,且每一帧的数据应为每次传输数据量的整数倍。

DM642 有 64 个 EDMA 通道[5] ,每一个通道都有一个特定的事件与之相关联,由这些事件触发相应通道的传输。表 1 中指明了 DM642 的视频口事件各自所对应的 EDMA 通道。

《表 1》

表 1 DM642 视频口事件与 EDMA 通道对应表

Table 1 DM642 EDMA channel synchronization video event

2)视频数据流输出实现

系统中视频口的输出也是 8 b BT.656 数据流。视频口被配置为视频输出口时,结构如图 5 所示。由于 VP 口只支持单通道视频输出,所以5 120 B 的缓冲区直接被分为 Y 缓冲区(2 560 B)、 Cb 缓冲区(1 280 B)和 Cr 缓冲区(1 280 B) [2] 。每个缓冲区分别对应着一个只写的存储器映射寄存器(YDST,CBDST,CRDST)该寄存器提供 EDMA 操作的目的地址。

对于视频显示模式,数据的传递也是通过 EDMA 来实现的。与输入模式不同之处在于, EDMA 事件的产生是基于缓冲区中可存储的双字节的个数,即所设定的阈值表明了缓冲区中还有多少剩余空间。

《图 5》

图 5 VP 口 BT.656 视频输出缓冲区结构

Fig.5 Video port BT.656 video display FIFO configuration

《3.2 软件部分》

3.2 软件部分

3.2.1   软件模块介绍系统主要使用了 FVID 模块、 SCOM 模块和 DAT 模块[6] 来实现视频信号的采集、传输和处理。

FVID 模块为 DSP/BIOS 程序提供 API 函数,以实现帧图像的获取和显示。 FVID 模块提供的设备驱动 API 函数不同于其他的设备驱动,因为它掌握数据缓冲区的所有权,应用程序按需求来分配缓冲区。对于大多数的 DSP/BIOS 设备驱动,最初都是由应用程序来控制数据缓冲区,并传递这些缓冲区的地址到设备驱动以实现数据的输入输出。 FVID 模块和视频捕获显示驱动与此不同,是由设备驱动来直接控制数据缓冲区,这是因为视频采集/显示系统通常需要有较大的、复杂的缓冲区,而且对数据读取速度的要求要远高于对缓冲区分配的灵活性和机动性的要求。设备驱动根据 FVID 通道的配置参数计算缓冲区的大小并分配缓冲区,而且至少要为每个 FVID 通道分配 3 个缓冲区,以确保视频图像的捕获和显示的连续性。

SCOM 模块的作用是在程序的不同任务之间传递消息,如在视频获取任务和视频显示任务之间传递消息。 SCOM 消息是由用户定义的,并在任务之间传递的数据对象。每一个 SCOM 消息都对应着一个缓冲区,任务收到这个 SCOM 消息后就可以访问该缓冲区。 SCOM 消息在任务之间的传递是通过 SCOM 队列来实现的。 SCOM 队列由SCOM create语句创建,任务使用SCOM putMsg把 SCOM 消息放到 SCOM 队列中,使用 SCOM getMsg把 SCOM 消息从 SCOM 队列中取出。图 6 解释了 SCOM 模块的工作模式。

《图 6》

图 6 SCOM 模块结构图

Fig.6 SCOM module block diagram

当前任务有若干缓冲区,需要由任务 A 向 buffer1写入数据,由任务 B 从 buffer2读取数据。当前任务需要告诉任务 A 和任务 B 缓冲区的位置,并保证任务 A 和任务 B 不在同一时间访问同一缓冲区。所以当前任务为任务 A 创建 SCOM 消息 A ,为任务 B 创建 SCOM 消息 B 。消息 A 为任务 A 指明往何处写,消息 B 为任务 B 指明从何处读。

DAT 模块所实现的功能是依靠 DMA/EDMA 进行数据传递。对于 DM642 , DAT 模块使用的是 QDMA 进行传输。 QDMA (快速 DMA)与 EDMA 相似,但是传输效率更高,尤其适用于需要快速传递数据的应用场合,例如紧耦合的循环代码中的数据搬移任务。使用 DAT 模块首先需要用DAT open语句打开该模块。 DAT copy则实现了从源地址拷贝一块线性数据到目的地址的操作。

3.2.2   软件实现部分程序中设定了 5 个任务,包括 4 路视频采集任务和 1 路视频显示任务。

首先在主程序中声明并创建一个 1 × 8 的 SCOM 队列数组,用以存放并传递对应 4 通道视频输入输出缓冲区的 SCOM 消息:

SCOM_Handle SCOM_obj [8] ;

SCOM_obj[0] =SCOM_create (“IN1ATODIS”, NULL);

SCOM_obj[1] = SCOM_create (“DISTOIN1A”, NULL);

(下略)。

在每个任务里都需要打开任务相关的 SCOM 队列,准备接收和发送 SCOM 消息,以视频采集一通道(VP1A)为例(在视频回显任务中需将所有的 8 个 SCOM 队列全部打开):

SCOM_Handle fromIn1atoDIS , fromDIStoIn1a ;

fromIn1atoDIS = SCOM _open (“IN1ATODIS”);

fromDIStoIn1a = SCOM_open (“DISTOIN1A”);

在每个任务里用 FVID_create 语句创建一个 FVID 通道,利用此通道传送设备专用的控制命令到设备驱动中,配置相应的视频编解码器(TVP5150 或 SAA7121)并启动视频帧图像的采集和显示(FVID_control命令实现)。

第一路视频采集任务的 FVID 通道名为 capChanel1a ,在该任务中,调用 FVID_alloc得到存有视频帧图像的视频获取缓冲区的地址,再将缓冲区的地址做为 SCOM 消息放入 SCOM 队列 fromIn1atoDIS 中发送。

FVID_Frame * capFrameBuf1a ;

FVID_alloc (capChanel1a , & capFrameBuf1a);

SCOM_putMsg ( fromIn1atoDIS ,(FVID Frame *) capFrameBuf1a);

在视频回显任务中( FVID 通道名为 disChanel),接收到 SCOM 队列 fromIn1atoDIS 中的 SCOM 消息,从而得到视频获取缓冲区的地址。

FVID_Frame * capFrameBuf1a ;

capFrameBuf1a =(FVID-Frame *) SCOM getMsg (fromIn1atoDIS , SYS FOREVER);

使用DAT_copy命令将视频获取缓冲区的数据拷贝至视频显示缓冲区,再利用 FVID 通道 disChanel 显示视频图像。完成显示后,利用 SCOM 队列 fromDIStoIn1a 发送消息通知第一路视频采集任务。

FVID_exchange (disChanel ,&disFrameBuf);

SCOM_putMsg (fromDIStoIn1a , SYS_FOREVER);

第一路视频采集任务接收到完成显示的消息后,重新捕获并发送下一帧信号。

SCOM_getMsg (fromDIStoIn1a , SYS FOREVER);

FVID_exchange (capChanel1a , & capFrameBuf1a);

《4   结语》

4   结语

系统与现有的其他视频处理系统相比,有着诸多优势。首先,由于 DM642 是针对多媒体应用而开发的专用媒体处理芯片,配有丰富的片上外设,所以基于其的实时视频处理系统硬件设计相对容易;其次,系统具有很强的可编程性,可以利用外接的 SDRAM 编程实现 MPEG2,MPEG4,H.263,H.264 等多种视频压缩编解码算法,在适用性上要远优于专用视频编解码系统;第三,由于 DSP 的运算速度快,所以实时性强也是系统优于其他系统的一大优势。

系统充分发挥了 DM642 在视频处理的优势,操作性好,通用性强。可以将系统作为一个通用的视频处理平台,在此平台上实现算法复杂、实时性要求高的各类视频及图像处理系统,亦可将系统应用于交通、监控等工程领域中。