VPO视频捕获过程Word格式.docx
- 文档编号:18121831
- 上传时间:2022-12-13
- 格式:DOCX
- 页数:13
- 大小:110.67KB
VPO视频捕获过程Word格式.docx
《VPO视频捕获过程Word格式.docx》由会员分享,可在线阅读,更多相关《VPO视频捕获过程Word格式.docx(13页珍藏版)》请在冰豆网上搜索。
在“deviceparamsptr”选项中填入在DSP应用程序中定义的设备实例的创建参数变量“_YTH_vCapPortParams”(若配置的是视频捕获端口VP0)或“_YTH_vDisPortParams”(若配置的是视频显示端口VP2),YTH_vCapPortParams和YTH_vDisPortParams结构变量的具体参数说明如前所述。
经过上述步骤以后就可以在DSP应用程序中通过调用DSP/BIOS所提供的API来完成与视频捕获、视频显示相关的数据I/O操作了。
DSP/BIOS所提供的与视频捕获和视频显示相关的API如下表所示。
在DSP应用程序中使用VPORTMini-Driver所需的DSP/BIOSAPI
API
说明
FVID_HandleFVID_create(Stringname,Intmode,Int*status,PtroptArgs,GIO_Attrs*attrs)
创建一个FVID(framevideo)对象句柄FVID_Handle用于控制后续的视频捕获/显示操作。
若需要创建一个控制VPORT进行视频捕获操作的FVID_Handle,则mode应设为IOM_INPUT;
反之,若需要创建一个控制VPORT进行视频显示操作FVID_Handle,则mode应设为IOM_OUTPUT。
该函数实际上调用了Mini-Driver的mdCreateChan()。
IntFVID_control(FVID_HandlegioChan,Intcmd,Ptrargs)
通过FVID_Handle可以启动VPORT、停止VPORT等一系列操作。
当需要启动VPORT进行视频捕获或视频显示操作时,cmd应该设置为VPORT_CMD_START;
当需要停止VPORT时,cmd应该设置为VPORT_CMD_STOP。
该函数实际上调用了Mini-Driver的mdControlChan()。
IntFVID_alloc(FVID_HandlegioChan,Ptrbufp)
在视频捕获模式下,该函数通过FVID_Handle为应用程序分配一块已经捕获好视频数据的缓冲区;
在视频显示模式下,该函数通过FVID_Handle为应用程序分配一块空闲的缓冲区用于填充视频图像数据给VPORT显示。
该函数实际上调用了Mini-Driver的mdSubmitChan()。
IntFVID_free(FVID_HandlegioChan,Ptrbufp)
在视频捕获模式下,该函数通过FVID_Handle将应用程序已经使用完了的一块捕获了视频图像数据的缓冲区的控制权释放掉;
在视频显示模式下,该函数通过FVID_Handle将应用程序已经填充完了用于显示的视频图像数据的一块缓冲区交给Mini-Driver以待输出显示。
IntFVID_exchange(FVID_HandlegioChan,Ptrbufp)
在视频捕获模式下,该函数通过FVID_Handle将应用程序使用完的一块填充了视频图像数据的缓冲区的控制权释放掉,并为应用程序重新分配一块新的填充了视频图像数据的缓冲区以待应用程序去处理;
在视频显示模式下,该函数通过FVID_Handle将应用程序已经填充完了待显示的视频图像数据的一块缓冲区交给Mini-Driver以待输出显示,并为应用程序重新分配一块新的空闲缓冲区用来填充视频图像数据。
下面说明一下当DM642的VPORT采用8-bitBT.656或Y/C模式来捕获或显示视频图像数据时,如何使用DDK中的VPORT驱动实现水平方向上1/2抽取以及色度信号重采样的操作。
当输入视频图像数据是4CIF格式数据(704×
576)时,我们能够很轻松的通过VPORT硬件上的水平1/2抽取滤波器并加之以软件方式实现的垂直方向上1/2抽取滤波来实现4CIF至CIF的图像格式转换。
首先,我们将程序中为VPORT驱动提供的VPORTCAP_Params类型结构体变量的scale属性设置为VPORT_SCALING_ENABLE,其它的所有属性与捕获4CIF格式的视频图像数据时的设置保持一致,这样,使用FVID_alloc(…)和FVID_exchange(…)所捕获到的每一帧图像的大小就是352×
576。
然后只要对Y、Cb、Cr缓冲区中的数据统一地取偶数行或奇数行即可。
注意:
此时Y信号每行数据的长度为352字节,Cb和Cr信号的每行数据长度为176(无论程序中有没有将VPORTCAP_Params类型结构体变量的resmpl属性设置为VPORT_RESMPL_ENABLE)。
另外,我们也能够很轻松的通过VPORT硬件上的色度重采样滤波器并加之以软件方式实现的垂直方向上1/2色度信号抽取滤波来实现4:
2:
2至4:
0的图像格式转换。
首先,我们将程序中为VPORT驱动提供的VPORTCAP_Params类型结构体变量的resmpl属性设置为VPORT_RESMPL_ENABLE,其它的所有属性都不变,这样,使用FVID_alloc(…)和FVID_exchange(…)所捕获到的每一帧数据就是经过色度水平滤波后的图像。
然后只要对Cb、Cr缓冲区(注意:
这里仅仅对Cb、Cr缓冲区中的数据进行操作)中数据统一地取偶数行或奇数行数据即可实现4:
这里需要注意的是单单将VPORTCAP_Params类型结构体变量的resmpl属性设置为VPORT_RESMPL_ENABLE不会使捕获到的图像数据的色度信息减少一半,而仅仅是对图像中每个字节的色度分量数据进行了滤波而已,所以我们还需要人为地以软件方式对垂直方向上的色度信息进行1/2色度信号抽取滤波来实现4:
如果需要在视频显示过程中进行4:
0至4:
2的转换,则最简单的一种方法是将4:
0格式的图像数据的Y分量保持不变,而将Cb、Cr分量的每一行数据复制成2份从而使图像数据色度分量在垂直方向上的数据量加倍(但并没有增加图像数据的信息量!
),然后将程序中为VPORT驱动提供的VPORTDIS_Params类型结构体变量的resmpl属性设置为VPORT_RESMPL_ENABLE,其它的所有属性都不变,这样就能够在视频显示通道中实现4:
2的图像格式转换。
FVID函数:
1)FVID_create()作用:
是分配并初始化FVID通道对象;
语法:
fvidChan=FVID_create(name,mode,*status,optArgs,*attrs);
参数定义:
Stringname
Intmode
Int*status
PtroptArgs
FVID_Attrs*attrs
其中:
name是设备实例的句柄,是一个字符串mode是选择的模式,只有两个值:
IOM_INPUT设置采集模式,IOM_OUTPUT设置显示模式。
status是由下层minidriver返回的状态值。
attrs是指向FVID_Attrs结构的指针:
FVID_Attrs的定义如下:
typedefstructFVID_Attrs{
Unstimeout;
}FVID_Attrs;
timeout成员用来指定旗语同步,它的值可以是:
SYS_FOREVER:
会让FVID_alloc,FVID_freeandFVID_exchange的调用不确定的等待到这个调用完成.
数字的timeout值会让这些APIs阻塞一段指定的时间(以系统时钟).0值会让APIs不阻塞,他们会立刻返回,这种情况下,应用程序会检查返回的status值来保证调用已经成功完成.
备注:
FVID_alloc,FVID_free和FVID_exchange的调用只能在DSP/BIOStask(TSK).
FVID_create的返回值:
如果通道成功的打开了,那么FVID_create返回一个指向通道的句柄.这个句柄可以用来让后来的模块调用这个通道.
实列:
FVID_ATTRSdispAttrs=FVID_ATTRS;
chanHandle=FVID_create(“\display0”,IOM_INPUT,NULL,NULL,&
dispAttrs);
2)FVID_control()作用是:
发送一个控制命令给下层的mini_driver
status=FVID_control(fvidChan,cmd,args);
参数定义:
FVID_HandlefvidChan
Intcmd
Ptrargs
ReturnValueIntstatus
参数说明:
fvidChan是FVID_create()创建的指向通道的句柄。
cmd有两个值:
IOM_ABORT----作用是中止所以的未定的I/O工作。
IOM_FLUSH----作用是所以采集口的工作被丢弃,所以显示I/O的工作正常进行。
Args 是要传递的命令(参数或者结构体)的指针。
返回值:
如果调用成功,FVID_control返回IOM_COMPLETED.如果有错误产生,这个调用会返回一个负值。
实例:
FVID_control(fvidChan,IOM_ABORT,NULL);
3)FVID_alloc()作用:
申请获得驱动程序缓存单元。
语法:
status=FVID_alloc(fvidChan,bufp);
FVID_HandlefvidChan
Ptrbufp
参数说明:
fvidChan是FVID_create()创建的指向通道的句柄。
bufp是输出参数,指向所申请的驱动缓存空间的指针。
返回值:
如果调用成功,FVID_alloc()返回IOM_COMPLETED,如果有错误产生,这个调用会返回一个负值。
备注:
这个函数只能是在外设已经加载和初始化之后才能调用。
其中的句柄应该由FVID_create()函数提供。
status=FVID_alloc(chanHandle,dispBuf);
4)FVID_exchange()作用:
交换应用程序和驱动程序缓存空间,实际作用相当于FVID_free()和FVID_alloc()函数的组合。
status=FVID_exchange(fvidChan,bufp);
LgUns*pSize
bufp是输入输出参数,刚开始指向的是应用程序需要交换的缓存空间,交换后,指向与驱动程序进行缓存空间交换后的内存空间。
pSize是指向bufp内存大小的指针。
如果调用成功,FVID_exchange()返回IOM_COMPLETED,如果有错误产生,这个调用会返回一个负值。
status=FVID_exchange(chanHandle,dispBuf);
5)FVID_free()作用:
释放返回应用程序申请的缓存给驱动程序
status=FVID_free(fvidChan,bufp);
bufp是输入参数,指向的是应用程序需要释放返回的缓存空间。
如果调用成功,FVID_free()返回IOM_COMPLETED,如果有错误产生,这个调用会返回一个负值。
Example
status=FVID_free(chanHandle,dispBuf);
6)FVID_delete()作用:
申请关闭一个FVIDchannel对象。
status=FVID_delete(fvidChan);
参说说明:
如果调用成功,FVID_delete()返回IOM_COMPLETED,如果有错误产生,这个调用会返回一个负值。
status=FVID_delete(chanHandle);
基于GIO/FVID的DSP视频驱动程序
技术分类:
微处理器与DSP
|2007-08-13
来源:
华中科技大学|作者:
臧博吴裕斌曹丹华
引言
随着时代的发展,DSP技术在远程监控、可视电话、工业检测等视频处理领域得到了广泛的应用,对于不同的视频处理系统,会使用不同的视频设备,所以有必要为视频没备设计驱动程序,为高层应用程序提供统一的接口来操作底层硬件。
只要是遵循此驱动程序接口标准开发的高层应用程序,都可以在具有相同接口的不同硬件平台上运行,具有很好的通用性和可移植性。
同时高层应用程序设计人员只要会使用设备驱动程序提供的API接口,就不必了解底层硬件的具体实现,可以大大提高整个视频系统的开发效率。
对于视频设备,TI公司也提出了对应的视频设备驱动程序模型,但这些模型主要是针对6000系列高端DSP,甚至是DM64X这样的视频处理专用DSP设计的。
而TMS320F2812(简称F2812)DSP这样的低端处理器,内部存储空间较小,且没有DM64X那样专用的视频接口。
本文针对这类问题,提出了对TI视频驱动模型进行简化和改造的方法,使视频设备驱动程序占用尽量少的系统资源,来完成对视频硬件设备的操作。
这种视频驱动模型的裁减方法,对于使用低端处理器的视频处理系统具有借可鉴性。
1、基于DSP/BIOS的外设
驱动开发模型
TI公司为开发DsP的外设驱动程序,推出了DSP/BIOSDeviceDriverkit,定义了标准的设备驱动模型,并提供了一系列的API接口。
如图1所示,外设驱动程序分为两层:
①类驱动(classdriver)。
类驱动程序用来为应用程序提供接口。
这部分程序与设备无关,主要功能包括维护设备数据缓冲区,向上提供API接口供应用层程序调用,并协调应用程序对外设操作的同步和阻塞;
向下提供适配层与迷你驱动层相连,实现API接口函数到迷你驱动层程序的映射。
类驱动程序与硬件无关,只要外设驱动模型选定了,类驱动程序就定下来了,不需要做多少修改。
②迷你驱动(minidriver)。
迷你驱动程序与设备相关,所以设计迷你驱动程序是外设驱动开发中的重点。
迷你驱动程序与类驱动层的接口格式是统一的,但迷你驱动程序对底层硬件的操作是根据硬件平台的不同而变化的。
迷你驱动接收类驱动层发出的IOM_Packet命令包,决定对底层硬件进行什么样的操作。
外设驱动程序模型又可以分为以下3类:
①PIP/PI0模型。
基于数据管道的I/O模型,每个管道都在维护自己的一个缓冲区。
当数据写入缓冲区,或从缓冲区取出数据时,便会激发notifyReader和notifyWriter函数实现数据的同步。
②SIO/DIO模型。
基于数据流的I/O模型,一个数据流是单向的,要么是输入,要么是输出,而且SIO/DIO模璎使用异步方式来操作I/0,对于数据的读写、处理可以同时进行。
③GI0模型。
通用的I/O模型,灵活性很强,且没有适配层,直接操作迷你驱动程序,主要用来设计新型的设备驱动模型。
2、视频处理系统硬件平台
硬件平台如图2所示。
系统以TI公司的F2812DSP作为中心处理器,以模拟摄像机进行视频信号采集,再使用SAA7111视频解码芯片将其转换为BT601格式的数字视频信号。
DSP将数字视频信号处理后,再写入输出帧缓存AL422中,并控制视频编码芯片ADV7177,将其转换为模拟电视信号输出。
整个系统以l片CPLD——IspMachLC4128来协调各个芯片之间的时序关系。
3、视频设备驱动程序开发
3.1设备驱动程序模型的选择
如上文介绍,常用的驱动程序模型包括3类:
PIO、SIO和GIO。
比较这3种模型可以知道:
PIO支持更底层的通信,适合设计比较简单的外设驱动程序。
例如在TI公司的6X11DSK板上实现的音频采集和回放,一般都是基于PIO模型的。
而SIO模型具有很好的缓冲器分配回收机制,比较适合描述视频设备,但是SIO的很多功能在本系统中使用不到,而且GIO模型设计的目的就是针对特殊硬件的新型设备,所以最终考虑使用GIO设备驱动模型。
TI公司最初设计的GIO模型其实是有缺陷的,主要在数据缓冲区管理的问题上,应用程序在取得缓冲区进行数据处理之后,却无法将缓冲区返回设备驱动程序。
于是TI公司在推出DM6北这一款主要用于视频处理的DSP芯片的同时,对GIO模型进行了改进,提出了专门针对视频设备的FVID模型。
FVID模型是建立在GIO模型之上的,以FVID_alloc、FVID_exchangc、FVID_free函数对GIO模型中的GIO_submit函数进行封装,解决了GIO模型中驱动程序不能回收缓冲区的问题。
此外FVID模型还专门设计了FVID_frame结构。
此结构中包含了常用的视频信号的信息,如行数、列数、YUV结构、场频等,很适合描述视频数据帧。
但FVID主要是针对DM64X系统设计的,DM64X的很多功能在F2812DSP上都不具备。
所以本设计针对F2812DSP视频处理系统,对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)所示。
而对于视频输出设备,以AL422FIFO作为硬件帧缓存,而不在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)的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VPO 视频 捕获 过程