初始化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显示(三)的更多相关文章

  1. 基于FFmpeg的Dxva2硬解码及Direct3D显示(四)

    初始化硬解码上下文 目录 初始化硬解码上下文 创建解码数据缓冲区 创建IDirectXVideoDecoder视频解码器 设置硬解码上下文 解码回调函数 创建解码数据缓冲区 这一步为了得到 LPDIR ...

  2. 基于FFmpeg的Dxva2硬解码及Direct3D显示(一)

    目录 前言 名词解释 代码实现逻辑 前言 关于视频软解码的资料网上比较多了,但是关于硬解可供参考的资料非常之有限,虽然总得来说软解和硬解的基本逻辑一样,但是实现细节上的差别还是比较多的.虽然目前功能已 ...

  3. 基于FFmpeg的Dxva2硬解码及Direct3D显示(五)

    解码及显示 目录 解码及显示 解码 显示 资源清理 解码 循环读取视频帧 AVPacket packet = { 0 }; while (av_read_frame(m_pFmtCtx, &p ...

  4. 基于FFmpeg的Dxva2硬解码及Direct3D显示(二)

    解析视频源 目录 解析视频源 获取视频流 解析视频流 说明:这篇博文分为"获取视频流"和"解析视频流"两个部分,使用的是FFmpeg4.1的版本,与网上流传的低 ...

  5. 使用C#+FFmpeg+DirectX+dxva2硬件解码播放h264流

    本文门槛较高,因此行文看起来会乱一些,如果你看到某处能会心一笑请马上联系我开始摆龙门阵 如果你跟随这篇文章实现了播放器,那你会得到一个高效率,低cpu占用(单路720p视频解码播放占用1%左右cpu) ...

  6. 【视频开发】 ffmpeg支持的硬解码接口

    To enable DXVA2, use the --enable-dxva2 ffmpeg configure switch. To test decoding, use the following ...

  7. [原]ffmpeg编译android 硬解码支持库 libstagefright

    最近花了一天时间将ffmpeg/tools/build_stagefright执行成功,主要是交叉编译所需要的各种动态库的支持没链接上,导致各种报错,基本上网络上问到的问题我都碰到了,特此记录下来. ...

  8. 【并行计算与CUDA开发】基于NVIDIA显卡的硬编解码的一点心得 (完结)

    原文:基于NVIDIA显卡的硬编解码的一点心得 (完结) 1.硬解码软编码方法:大体流程,先用ffmpeg来读取视频文件的包,接着开启两个线程,一个用于硬解码,一个用于软编码,然后将读取的包传给解码器 ...

  9. 最简单的基于FFMPEG的封装格式转换器(无编解码)

    本文介绍一个基于FFMPEG的封装格式转换器.所谓的封装格式转换,就是在AVI,FLV,MKV,MP4这些格式之间转换(相应.avi,.flv,.mkv,.mp4文件).须要注意的是,本程序并不进行视 ...

随机推荐

  1. 多测师讲解接口测试 —jmeter接数据库(004)_高级讲师肖sir

    1.连接数据库jar包 2. 3. jdbc:mysql://192.168.153.131:3306/baoan?zeroDateTimeBehavior=convertToNull&all ...

  2. 多测师_高级讲师肖sir讲解html中 Button跳转连接方法归纳

    第一种方法: 1.1<a href="http://www.baidu.com">   <input type="button" name=& ...

  3. python 使用pyinstaller打包程序

    使用pyinstaller 打包.py脚本,在其他计算机可以直接运行,不需要python环境 安装pyinstaller库 pip install pystaller 打包程序 pyinstaller ...

  4. python接口测试之excel的操作

    1 用到的第三方库openpyxl,需要在命令窗口中下载安装pip install openpyxl,主要对xlsx格式的excel进行读取和编辑: xlrd库从excel中读取数据,支持xlsx x ...

  5. spring-boot-route(十八)spring-boot-adtuator监控应用

    Spring Boot提供了良好的服务监控模块,只需要通过简单的配置便可以完成服务监控和管理.但是服务监控这块内容往往是最容易被忽略的一块内容,今天我们一起来学习一下使用spring-boot-act ...

  6. git stash功能的使用

    一,git stash的作用: 能够将所有未提交的修改(工作区和暂存区)保存至堆栈中,用于后续恢复当前工作目录 说明:架构森林是一个专注架构的博客,地址:https://www.cnblogs.com ...

  7. xpath取其中几个使用position

    from lxml import etree html = ''' <!DOCTYPE html> <html lang="en"> <head> ...

  8. php+nginx 整合

    php编译 https://www.cnblogs.com/php-linux/p/12360858.html nginx编译 https://www.cnblogs.com/php-linux/p/ ...

  9. PHP SPL标准库-接口

    PHP SPL标准库有一下接口: Countable OuterIterator RecursiveIterator SeekableIterator SplObserver SplSubject A ...

  10. GoogleHacking基本语法使用

    查看网络后台 intitle:admin 搜索url中的关键字:asp?id= inurl:asp?id=