当前位置: 首页 > article >正文

基于FFmpeg的Dxva2硬解码及Direct3D显示(三)

目录

  • 初始化Direct3D
    • 创建Direct3D物理设备对象实例
    • 创建Direct3D渲染设备实例
    • 创建Direct3D视频解码服务

初始化Direct3D

Direct3D渲染可以通过Surface和Texture来实现,后者比较复杂,只是显示视频的化用Surface足以。Direct3D有几个重要的概念需要说明以下:

Device:就是渲染设备实例

Resources:可以理解成一个参数结构体,描述怎样渲染的细节。

Swap Chains:交换链,由一个或者多个缓冲区组成,可以理解成包含多个缓冲区的数组,如下图所示。

1566872-20190128193551659-512413794.png

创建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;
}

转载于:https://www.cnblogs.com/huluwa508/p/10304442.html

http://www.lryc.cn/news/2416008.html

相关文章:

  • 10个可爱的外国互动型网站
  • 蓝牙为什么称为蓝牙
  • python-flask计算机毕业设计网上书店信息管理系统(程序+开题+论文)
  • 2023 小额贷款系统源码
  • 用HTML和css实现滚动条
  • 中国高校BBS大全
  • FileUpload文件上传控件
  • 学习计算机编程(IT、偏网站开发)的参考学习网址syk
  • beini安装破*WIFI
  • swift快捷键大全
  • pushlet推送引入SSM项目
  • SAP系统如何运维
  • asp毕业设计——基于ASP+贝叶斯过滤技术的反垃圾邮件管理系统设计与实现(毕业论文+程序源码)——反垃圾邮件管理系统
  • 联发科技发布GSM手机单芯片方案MT6253和智能手机方案MT6516
  • BAT脚本加防火墙455端口
  • 韩国李世龙19岁当爹 与洪瑛琦姐弟恋开花结果
  • Joomla框架搭建远程代码执行(RCE)漏洞复现
  • Directory Listing Denied错误原因和解决方案
  • java虚拟机参数优化_JAVA虚拟机JVM参数优化(2):垃圾收集算法选择
  • 用DW制作简单的浮动广告
  • Transformers 4.37 中文文档(一百)
  • 3D蜘蛛网提供大量的3D模型下载
  • pos与posEx
  • js面试题及答案汇总
  • 鼠标左键单击变双击怎么维修?如何解决鼠标单击异常现象
  • html字体颜色 html中设置字体颜色代码 字体颜色获取
  • java基本集合源码解读-JDK8/11
  • Android学习之 adb被占用解决办法
  • SpringBoot-自定义转换器
  • 怎样才能知道自己的手机是否支持北斗导航?