基于FFmpeg的Dxva2硬解码及Direct3D显示(三)
初始化Direct3D
Direct3D渲染可以通过Surface和Texture来实现,后者比较复杂,只是显示视频的化用Surface足以。Direct3D有几个重要的概念需要说明以下:
Device:就是渲染设备实例
Resources:可以理解成一个参数结构体,描述怎样渲染的细节。
Swap Chains:交换链,由一个或者多个缓冲区组成,可以理解成包含多个缓冲区的数组,如下图所示。

创建Direct3D物理设备对象实例
这一步为了得到IDirect3D9* 实例 m_pD3d9;
m_hD3dDll = LoadLibrary("d3d9.dll");
pDirect3DCreate9 *createD3D = (pDirect3DCreate9 *)GetProcAddress(m_hD3dDll, "Direct3DCreate9");
m_pD3d9 = createD3D(D3D_SDK_VERSION);// 怎样指定GPU?
创建Direct3D渲染设备实例
这一步为了得到IDirect3DDevice9* 实例 m_pD3d9Dev;
// 获取显示适配器参数
D3DDISPLAYMODE displayModel;
if (m_pD3d9->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &displayModel) < 0)
{
return FALSE;
}
D3DPRESENT_PARAMETERS presentParms = { 0 };
presentParms.Windowed = TRUE; // 是否窗口显示
presentParms.BackBufferCount = 0; // 后台缓冲表面数量,指定为0时会被视为1
presentParms.hDeviceWindow = m_hWnd; // 显示窗口句柄
presentParms.SwapEffect = D3DSWAPEFFECT_DISCARD; // 交换链设置,后台缓冲使用后直接丢弃
presentParms.BackBufferFormat = displayModel.Format;// 后台缓冲表面格式
presentParms.EnableAutoDepthStencil = FALSE; // 是否自动创建深度模板缓冲,适用于3D场景
presentParms.Flags = D3DPRESENTFLAG_VIDEO; // 附加特性,显示视频
presentParms.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT; // 刷新率,窗口模式时必须为0
presentParms.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT; // 前后台缓冲区的交换频率
// 查询设备是否支持硬件加速渲染
DWORD behaviorFlags = D3DCREATE_SOFTWARE_VERTEXPROCESSING | D3DCREATE_MULTITHREADED;
D3DDEVTYPE devType = D3DDEVTYPE_HAL;
D3DCAPS9 caps;
if (m_pD3d9->GetDeviceCaps(D3DADAPTER_DEFAULT, devType, &caps) >= 0)
{
if (caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT)
{
behaviorFlags = D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_MULTITHREADED | D3DCREATE_FPU_PRESERVE;
}
else
{
behaviorFlags = D3DCREATE_SOFTWARE_VERTEXPROCESSING | D3DCREATE_MULTITHREADED | D3DCREATE_FPU_PRESERVE;
}
}
else
{
return FALSE;
}
// 创建渲染设备实例
if (m_pD3d9->CreateDevice(D3DADAPTER_DEFAULT, devType, m_hWnd,
behaviorFlags, &presentParms, &m_pD3d9Dev) < 0)
{
return FALSE;
}
创建Direct3D视频解码服务
这一步为了得到IDirectXVideoDecoderService* 实例 m_pDecoderService;
m_hDxva2Dll = LoadLibrary("dxva2.dll");
if (!m_hDxva2Dll)
{
return FALSE;
}
pCreateDeviceManager9 *createDeviceManager = (pCreateDeviceManager9 *)GetProcAddress(m_hDxva2Dll, "DXVA2CreateDirect3DDeviceManager9");
// 设备管理器实例标识
unsigned resetToken = 0;
if (createDeviceManager(&resetToken, &m_pD3d9DevMgr) < 0)
{
return FALSE;
}
// 重置渲染设备
HRESULT hr = m_pD3d9DevMgr->ResetDevice(m_pD3d9Dev, resetToken);
if (FAILED(hr))
{
return FALSE;
}
// 打开渲染设备
hr = m_pD3d9DevMgr->OpenDeviceHandle(&m_hDev);
if (FAILED(hr))
{
return FALSE;
}
// 获取视频渲染服务实例
hr = m_pD3d9DevMgr->GetVideoService(m_hDev, IID_IDirectXVideoDecoderService, (void **)&m_pDecoderService);
if (FAILED(hr))
{
return FALSE;
}
基于FFmpeg的Dxva2硬解码及Direct3D显示(三)的更多相关文章
- 基于FFmpeg的Dxva2硬解码及Direct3D显示(四)
初始化硬解码上下文 目录 初始化硬解码上下文 创建解码数据缓冲区 创建IDirectXVideoDecoder视频解码器 设置硬解码上下文 解码回调函数 创建解码数据缓冲区 这一步为了得到 LPDIR ...
- 基于FFmpeg的Dxva2硬解码及Direct3D显示(一)
目录 前言 名词解释 代码实现逻辑 前言 关于视频软解码的资料网上比较多了,但是关于硬解可供参考的资料非常之有限,虽然总得来说软解和硬解的基本逻辑一样,但是实现细节上的差别还是比较多的.虽然目前功能已 ...
- 基于FFmpeg的Dxva2硬解码及Direct3D显示(五)
解码及显示 目录 解码及显示 解码 显示 资源清理 解码 循环读取视频帧 AVPacket packet = { 0 }; while (av_read_frame(m_pFmtCtx, &p ...
- 基于FFmpeg的Dxva2硬解码及Direct3D显示(二)
解析视频源 目录 解析视频源 获取视频流 解析视频流 说明:这篇博文分为"获取视频流"和"解析视频流"两个部分,使用的是FFmpeg4.1的版本,与网上流传的低 ...
- 使用C#+FFmpeg+DirectX+dxva2硬件解码播放h264流
本文门槛较高,因此行文看起来会乱一些,如果你看到某处能会心一笑请马上联系我开始摆龙门阵 如果你跟随这篇文章实现了播放器,那你会得到一个高效率,低cpu占用(单路720p视频解码播放占用1%左右cpu) ...
- 【视频开发】 ffmpeg支持的硬解码接口
To enable DXVA2, use the --enable-dxva2 ffmpeg configure switch. To test decoding, use the following ...
- [原]ffmpeg编译android 硬解码支持库 libstagefright
最近花了一天时间将ffmpeg/tools/build_stagefright执行成功,主要是交叉编译所需要的各种动态库的支持没链接上,导致各种报错,基本上网络上问到的问题我都碰到了,特此记录下来. ...
- 【并行计算与CUDA开发】基于NVIDIA显卡的硬编解码的一点心得 (完结)
原文:基于NVIDIA显卡的硬编解码的一点心得 (完结) 1.硬解码软编码方法:大体流程,先用ffmpeg来读取视频文件的包,接着开启两个线程,一个用于硬解码,一个用于软编码,然后将读取的包传给解码器 ...
- 最简单的基于FFMPEG的封装格式转换器(无编解码)
本文介绍一个基于FFMPEG的封装格式转换器.所谓的封装格式转换,就是在AVI,FLV,MKV,MP4这些格式之间转换(相应.avi,.flv,.mkv,.mp4文件).须要注意的是,本程序并不进行视 ...
随机推荐
- 多测师讲解selenium__论坛验证码_处理方法_ 高级讲师肖sir
1.登录我们搭建的论坛环境 2. 3. 4.
- 多测师肖sir_pdf转word方法
1.百度搜索 my love pdf 在线转换 2.输入wps 下载软件
- MeteoInfoLab脚本示例:计算垂直螺旋度
尝试编写MeteoInfoLab脚本计算垂直螺旋度,结果未经验证. 脚本程序: print 'Open data files...' f_uwnd = addfile('D:/Temp/nc/uwnd ...
- MeteoInfoLab脚本示例:创建netCDF文件(合并文件)
在MeteoInfoLab中增加了创建netCDF文件并写入数据的功能,这里利用合并多个netCDF文件为一个新的netCDF文件为例.1.创建一个可写入的netCDF文件对象(下面用ncfile表示 ...
- C语言的污垢,一个能污染内存的神秘操作!神级坑位再现~
本文目的是为了更好的理解指针和内存管理 背景 我们定义一个变量A,修改另外一个一个变量B,导致A的值被修改,我们称它为内存污染. 案例 如下程序,正常的预期输出应该是:97 98 256 ,但正确的结 ...
- centOS7 查看防火墙状态 开放端口
一.防火墙的开启.关闭.禁用命令 (1)设置开机启用防火墙:systemctl enable firewalld.service (2)设置开机禁用防火墙:systemctl disable fire ...
- Ubuntu搜狗输入法安装
一.下载sogoupinyin_2.2.0.0108_amd64.deb 二.拷贝到服务器并安装 sudo dpkg -i sogoupinyin_2.2.0.0108_amd64.deb 三.设置搜 ...
- C# 采用Basic Auth传递Post或者GET 数据
摘自:http://www.cnblogs.com/starcrm/p/4837971.html public class JiraApi{private string m_Username;priv ...
- shell中将带分隔符的字符串转为数组
shell中将字符串列表转换成数组,需要将数组用括号来表示,元素用"空格"符号分割开,格式如下: array_name=(value1 ... valuen) 使用内置的分割符IF ...
- <img>元素边距问题
解决方式: 给 img 元素设置成 "块" display:block; 另一种 vertical-align: bottom;