学习下。

要使用TI DDK中实现的VPORT驱动程序,首先需要在程序中提供VPORT_PortParams类型的参数变量、VPORTCAP_Params类型的参数变量以及VPORTDIS_Params类型的参数变量。

其次,在DSP/BIOS应用程序中使用DDK所提供的Mini-Driver前需要使用DSP/BIOS配置工具(DSP/BIOSConfiguration Tool)对DSP/BIOS程序的“.cdb”文件进行配置:

Step1:打开项目文件目录中DSP/BIOSConfig目录中的“.cdb”文件;

Step2:展开Input/Output-> Device Drivers,选择User-DefinedDevices右键菜单中的“InsertUDEV”创建一个用户自定义的外部设备(该设备实例对象将在DSP/BIOS初始化时被建立起来)并重命名为一个有效的设备名,如“VP0CAPTURE”(若配置的是视频捕获端口VP0)或“VP2DISPLAY”(若配置的是视频显示端口VP2);

Step3:选择自定义外部设备的右键菜单中的properites选项配置该设备:

在“function tableptr”选项中填入“_VPORTCAP_Fxns”(若配置的是视频捕获端口VP0)或“_VPORTDIS_Fxns”(若配置的是视频显示端口VP2);

在“function table type”选项中选择“IOM_Fxns”;

在“deviceid”选项中填入有效的设备号“0×00000000”(若配置的是视频捕获端口VP0)/“0×00000002”(若配置的是视频显示端口VP2);

在“device paramsptr”选项中填入在DSP应用程序中定义的设备实例的创建参数变量“_YTH_vCapPortParams”(若配置的是视频捕获端口VP0)或“_YTH_vDisPortParams”(若配置的是视频显示端口VP2),YTH_vCapPortParams和YTH_vDisPortParams结构变量的具体参数说明如前所述。

经过上述步骤以后就可以在DSP应用程序中通过调用DSP/BIOS所提供的API来完成与视频捕获、视频显示相关的数据I/O操作了。DSP/BIOS所提供的与视频捕获和视频显示相关的API如下表所示。

在DSP应用程序中使用VPORTMini-Driver所需的DSP/BIOS API

API 说明
FVID_Handle FVID_create(String name,Int mode, Int *status, Ptr optArgs, GIO_Attrs *attrs) 创建一个FVID(framevideo)对象句柄FVID_Handle用于控制后续的视频捕获/显示操作。若需要创建一个控制VPORT进行视频捕获操作的FVID_Handle,则mode应设为IOM_INPUT;反之,若需要创建一个控制VPORT进行视频显示操作FVID_Handle,则mode应设为IOM_OUTPUT。该函数实际上调用了Mini-Driver的mdCreateChan()。
Int FVID_control(FVID_Handle gioChan,Int cmd, Ptr args) 通过FVID_Handle可以启动VPORT、停止VPORT等一系列操作。当需要启动VPORT进行视频捕获或视频显示操作时,cmd应该设置为VPORT_CMD_START;当需要停止VPORT时,cmd应该设置为VPORT_CMD_STOP。该函数实际上调用了Mini-Driver的mdControlChan()。
Int FVID_alloc(FVID_Handle gioChan,Ptr bufp) 在视频捕获模式下,该函数通过FVID_Handle为应用程序分配一块已经捕获好视频数据的缓冲区;在视频显示模式下,该函数通过FVID_Handle为应用程序分配一块空闲的缓冲区用于填充视频图像数据给VPORT显示。该函数实际上调用了Mini-Driver的mdSubmitChan()。
Int FVID_free(FVID_Handle gioChan, Ptrbufp) 在视频捕获模式下,该函数通过FVID_Handle将应用程序已经使用完了的一块捕获了视频图像数据的缓冲区的控制权释放掉;在视频显示模式下,该函数通过FVID_Handle将应用程序已经填充完了用于显示的视频图像数据的一块缓冲区交给Mini-Driver以待输出显示。该函数实际上调用了Mini-Driver的mdSubmitChan()。
Int FVID_exchange(FVID_Handle gioChan,Ptr bufp) 在视频捕获模式下,该函数通过FVID_Handle将应用程序使用完的一块填充了视频图像数据的缓冲区的控制权释放掉,并为应用程序重新分配一块新的填充了视频图像数据的缓冲区以待应用程序去处理;在视频显示模式下,该函数通过FVID_Handle将应用程序已经填充完了待显示的视频图像数据的一块缓冲区交给Mini-Driver以待输出显示,并为应用程序重新分配一块新的空闲缓冲区用来填充视频图像数据。该函数实际上调用了Mini-Driver的mdSubmitChan()。

下面说明一下当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:2:0的图像格式转换。

首先,我们将程序中为VPORT驱动提供的VPORTCAP_Params类型结构体变量的resmpl属性设置为VPORT_RESMPL_ENABLE,其它的所有属性都不变,这样,使用FVID_alloc(…)和FVID_exchange(…)所捕获到的每一帧数据就是经过色度水平滤波后的图像。然后只要对Cb、Cr缓冲区(注意:这里仅仅对Cb、Cr缓冲区中的数据进行操作)中数据统一地取偶数行或奇数行数据即可实现4:2:2至4:2:0的图像格式转换。这里需要注意的是单单将VPORTCAP_Params类型结构体变量的resmpl属性设置为VPORT_RESMPL_ENABLE不会使捕获到的图像数据的色度信息减少一半,而仅仅是对图像中每个字节的色度分量数据进行了滤波而已,所以我们还需要人为地以软件方式对垂直方向上的色度信息进行1/2色度信号抽取滤波来实现4:2:2至4:2:0的图像格式转换。

如果需要在视频显示过程中进行4:2:0至4:2:2的转换,则最简单的一种方法是将4:2:0格式的图像数据的Y分量保持不变,而将Cb、Cr分量的每一行数据复制成2份从而使图像数据色度分量在垂直方向上的数据量加倍(但并没有增加图像数据的信息量!),然后将程序中为VPORT驱动提供的VPORTDIS_Params类型结构体变量的resmpl属性设置为VPORT_RESMPL_ENABLE,其它的所有属性都不变,这样就能够在视频显示通道中实现4:2:0至4:2:2的图像格式转换。

[转载] DDK中VPORT Mini-Driver的使用说明的更多相关文章

  1. element框架中表格的筛选功能使用说明(转载)

    一.element框架中表格的筛选功能使用说明 转载:https://blog.csdn.net/liangxhblog/article/details/80513030 在element ui 框架 ...

  2. node.js中的url.parse方法使用说明

    node.js中的url.parse方法使用说明:https://blog.csdn.net/swimming_in_it_/article/details/77439975 版权声明:本文为博主原创 ...

  3. Qt5.7中使用MySQL Driver

    Qt5.7中使用MySQL Driver 1.使用环境 Qt5.7的安装安装就已经带了MySQL Driver,只需要在安装的时候选择一下即可. 如果没有安装,可以采取自己编译的方式. 在Qt的源码包 ...

  4. Delphi 中Format的字符串格式化使用说明(转)

    源:Delphi 中Format的字符串格式化使用说明(转) 一.Format函数的用法 Format是一个很常用,却又似乎很烦的方法,本人试图对这个方法的帮助进行一些翻译,让它有一个完整的概貌,以供 ...

  5. 在myeclipse中配置DB Driver(数据库用MySql),并在myeclipse执行sql语句操作

    在myeclipse中配置DB Driver(数据库用MySql),并在myeclipse执行sql语句操作 MyEclipse6.5    ,  mysq驱动jar包为mysql-connector ...

  6. Qt5.7中使用MySQL Driver(需要把libmysql.dll文件拷贝到Qt的bin目录中。或者自己编译的时候,链接静态库)

    Qt5.7中使用MySQL Driver 1.使用环境 Qt5.7的安装安装就已经带了MySQL Driver,只需要在安装的时候选择一下即可.如果没有安装,可以采取自己编译的方式.在Qt的源码包的q ...

  7. 如何快速转载CSDN中的博客

    看到一篇<如何快速转载CSDN中的博客>,介绍通过检查元素→复制html来实现快速转载博客的方法.不过,不知道是我没有领会其精神还是其他原因,测试结果为失败.

  8. 如何在ASP.NET Core Web API中使用Mini Profiler

    原文如何在ASP.NET Core Web API中使用Mini Profiler 由Anuraj发表于2019年11月25日星期一阅读时间:1分钟 ASPNETCoreMiniProfiler 这篇 ...

  9. [转载]Java中继承、装饰者模式和代理模式的区别

    [转载]Java中继承.装饰者模式和代理模式的区别 这是我在学Java Web时穿插学习Java设计模式的笔记 我就不转载原文了,直接指路好了: 装饰者模式和继承的区别: https://blog.c ...

随机推荐

  1. (1)python tkinter-窗体

    1.导入自带的包名 import tkinter 2.创建一个窗体对象 form=Tkinter.Tk() 3.显示窗体(这句应该是所有的设置部署完最后执行的一句代码) form.mainloop() ...

  2. laravel装饰者模式例子

    interface Decorator{ public function display(); } class XiaoFang implements Decorator { private $nam ...

  3. STM32F4X 关于MDK上虚拟串口调试

    1. 下载安装VSPD 自行百度安装后,利用VSPD将PC上的两个虚拟串口连接起来.如图我将COM1 和COM2连接起来. a. 点击Addr pair. 可以看到Virtual ports上将两个虚 ...

  4. 夏令营501-511NOIP训练18——高三楼

    传送门:QAQQAQ 题意:定义矩阵A与矩阵B重复,当且仅当A可以通过任意次行列交换得到B,例如下图A,B即为合法矩阵 现求对于$n*n$的矩阵有多少个不重复的矩阵 数据范围: 对于10%的数据 N≤ ...

  5. import socket模块二

    ---恢复内容开始--- 优化两个小脚本实现不间断聊天: server.py: import socket sk = socket.socket() # 创建socket addess = ('127 ...

  6. mybatis中一对一关系映射

    一对一关系中普通的配置方式 一.多表连接查询语句: <select id="selectStudentWithAddress" parameterType="int ...

  7. 【LGP4714】「数学」约数个数和

    题目 众所周知,除数个数函数\(\sigma_0=I^2\),\(I\)就是狄利克雷卷积里的\(1\)函数 于是熟悉狄利克雷卷积的话很快就能看出我们要求的就是\(I\times I^{k}\),即\( ...

  8. centos 7 开机启动服务项优化

    1. 使用 systemctl list-unit-files 可以查看启动项 systemctl list-unit-files | grep enable 过滤查看启动项如下 abrt-ccpp. ...

  9. 微信小程序前后台调用

    // pages/ruquestexer/index.js Page({ /** * 页面的初始数据 */ data: { }, getUserData:function(){ wx.request( ...

  10. 【珍惜时间】iReport

    项目很点意思,感觉很高超的样子 先放下项目的github地址:https://github.com/tctangyanan/iReport 感谢各位伟大的程序员无私的分享自己的技术 老规矩,我们会运行 ...