此外FVID模型还专门设计了FVID_frame结构。此结构中包含了常用的视频信号的信息,如行数、列数、YUV结构、场频等,很适合描述视频数据帧。但FVID主要是针对DM64X系统设计的,DM64X的很多功能在F2812 DSP上都不具备。所以本设计针对F2812 DSP视频处理系统,对FVID模型进行了一定的简化,保留类驱动程序,而重写了迷你驱动层程序。
3.2 视频处理程序运行流程
在设计完成的视频驱动程序基础上,开发一个典型的视频处理应用程序,其运行流程如图3所示。首先使用FVID_create函数建立GIO_capture和GIO_play两个视频通道.再以GIO_capture通道的FVID_control函数发出cmd_start,采集到1帧视频数据。应用程序以GIO_capture通道的FVID_alloc函数向驱动程序申请采集到的数据帧,进行处理后再以FVID_exchange函数将修改后的数据帧返回驱动程序,最后再调用GI0_play通道的FVID_control函数发出cmd_display命令将数据帧输出。由图3可以看到,应用程序调用的这些FVID_XXX接口函数会自动由类驱动程序层层向下映射,到达迷你驱动层程序;而迷你层程序可以直接操纵底层硬件设备,来完成整个视频的采集、处理和显示的过程。
3.3 迷你驱动程序的设计
迷你层驱动程序足整个设计的重点所在,下面详细介绍其实现方法。迷你层驱动程序主要由表1所列的几个函数组成。
对各个函数的具体实现如下:
①mdBindDev函数。在应用程序建立设备接口(如FVID_create函数)时被调用,完成对外部设备的初始化。而与其对应的是md_UBindDev函数,使用nadUBindDev函数会使设备处于无效状态,不能再使用。
②mdCreateChan函数。使用此函数为应用程序和驱动程序建立通信通道,同时为每个通道申请缓冲区。在TI公司发 布的FVID模型中,为每个通道都分配了3个缓冲区,轮流与外部设备交换数据,每个缓冲区对应1帧视频数据,这样的设计在DM642这样可以外扩大容量SDRAM的系统中是完全可行的。但是对于本系统,F2812DSP外部只扩展了512K×16位的SRAM,既要做视频输入的帧缓存,义要存放一部分程序,这样存储空间就不够了。所以本设计中进行了简化,对视频输入设备采用两缓冲区轮转的机制,如图4(a)所示。而对于视频输出设备,以AL422 FIFO作为硬件帧缓存,而不在SRAM中再为其分配缓冲区。与mdCreateChan对应的是md-DeleteChan函数,用于删除设备通道,释放缓冲区资源。
③mdSubmitChan函数。负责管理缓冲区。分别接受应用程序发出的FVID_ALLOC、FVID_EXCHANGE、FVID_FREE三个命令并进行处理。其中FVID_ALLOC命令对应图4中(a)到(b)的过程,应用程序从两个缓冲区中取出最新的一帧视颧数据,埘其中的数据做处理,而只剩下一个缓冲区用来接受外部设备输入的数据。FVID_EXCHANGE对应图4中(b)到(c)的过程,应用程序处理完1帧数据,将这1帧数据返回驱动程序,准备用来显示,同时再读入新的l帧数据进行处理。FVID_FREE对应图4中(c)到(a)的过程,应用程序将处理完的数据帧返回驱动程序,而不再向驱动程序申请新的数据帧。以上3个命令足针对视频输入接口GIO_capture而言的,而对于输出设备接口GIO_play,在SRAM中没有分配缓冲区,所以其nldSubmitChan函数内部设为空函数。