基本的工作原理:首先通过FFmpeg获取视频,可以是通过摄像头,文件,截屏等。然后利用QT中的OpenGL组件显示视频。主要的工作是利用着色器进行视频格式转换,因为获取到的视频格式一般是YUV格式,显示到显示器上的一般是RGB格式。这里的代码只实现了YUV422格式的转换,其他格式类似。 下面是视频获取类VideoSource.h头文件: #pragma once extern “C” { #include “libavcodec/avcodec.h” #include “libavformat/a […]
FFmpeg是纯C语法的,内部结构体内存分配和释放需要调用专门的函数,比如avformat_alloc_context,avformat_free_context等。使用起来不太方便,如果调用的时候忘记了一一对应的,很容易造成内存泄漏。 因此用C++的模板把ffmpeg中的内存分配进行了封装。下面的例子只是对AVFormatContext, AVCodecContext进行了封装,其他结构体封装起来也很方便,只需重载FFmpegPtrTraits类就可以。 template<typename T> class FFmpegPtrTraits; template& […]
OpenGL和Direct3D中的资源可以被映射到cuda的内存空间,以允许cuda读取,也允许cuda写入后供OpenGL和Direct3D使用。 在映射之前,需要对资源进行注册(register),会得到一个cudaGraphicsResource的指针。使用完成后,需要通过cudaGraphicsUnregisterResource注销资源。 一旦资源注册成功,就可以对资源进行映射cudaGraphicsMapResources和取消映射cudaGraphicsUnmapResource,映射可以根据需要是多次的。映射后的内存,可以被内核函数使用,通过cudaGraphicsResour […]
最近看了下微软的Media Foundation,发现Media Foundation里面的EVR使用比较旧的Direct3D API,于是想直接使用Direct3D 11 Video API来播放视频。并且可以在视频上添加图片和显示文字,又不想使用Media Foundation的pipeline。视频采集利用Media Foundation 的source reader,或者使用ffMpeg获取视频,然后直接通过Direct3D 11/12 Video A […]
cuda可以让不互相依赖的任务进行并行操作,主要任务包括如下: 主机端的计算 设备端的计算 主机到设备端的内存数据传输 设备到主机端的内存数据传输 设备内的内存之间的数据传输 设备到设备之间的数据传输 在主机和设备间可以并行执行的操作有: 内核函数执行 单个设备内存间的数据拷贝 主机到设备的内存拷贝,内存块的大小,小于64KB。 以async为前缀的内存拷贝函数 memory set function calls 并行执行的特性,可以查询设备的属性,查看是否支持。 cudaDeviceProp.asyncEngineCount > 0 // 支持c […]
cuda纹理和表面内存是一种特殊的全局内存,主要针对二维空间的局部性访问进行了优化。纹理内存是只读的,而表面内存是可读可写的。纹理和表面内存都支持一维、二维和三维。 纹理内存的属性: read mode用来指定返回值是归一化模式,还是原始值模式。如果是cudaReadModeNormalizedFloat,则返回[0.0 1.0]之间的浮点数;如果是cudaReadModeElementType,则返回原始值。 addressing mode指定寻址模式,也就是超出坐标范围值如果取值。有 […]
有时候需要将数据的存储和访问分别放到不同对象中,这时就可以使用访问者模式: class MultiThreadVector { std::vector<int> mArray; std::mutex mMtx; public: class Accessor { MultiThreadVector &mData; std::unique_lock<std::mutex> mGuard; public: Accessor(MultiThreadVector &data) : mData(data), mGuard(data.mMtx) { } void pu […]
1. 创建存放cuda代码的筛选器, 2. 在筛选器中添加cuda源码文件 3. 右击项目—->“生成自定义”,在弹出的窗口中勾选cuda的对应版本。 4. 修改cuda文件的编译链接设置,右击cuda源文件—–>“属性”,在弹出窗口中—->“常规”—->”项类型“的下拉列表中选择点击”应用“后,”常规“下方会出现一个”cuda c/c++”的设置。 5. 修改工程设置,“链接器”—>”输入”—>”附加依赖项R […]
动态链接库的使用有两种方式,一种是在编译的时候就把动态链接库的头文件包含起来,链接的时候,系统自动去查找需要的动态链接库;另一种是程序动态的去加载,windows下是使用LoadLibrary加载库文件,然后通过GetProcAddress获取函数指针;在linux下是使用dlopen加载库文件,然后通过dlsym获取函数指针。但是动态加载的方式,需要在调用的地方定义很多函数指针,使用起来不太方便,而且动态链接库改了接口,使用的地方也需要相应的修改。有没有更好的方法呢?当然有,可以利用可变参数模板来改善动态加载链接库的使用。 windows […]
GoF中的观察者模式,是设计中经常使用的模式。 #include<list> class Subject; class Observer { public: virtual ~Observer(); virtual void Update(Subject* changedSubject) = 0; protected: Observer(); }; class Subject { public: virtual ~Subject(); virtual void Attach(Observer *); virtual void Detach( […]