基于FFmpeg的Dxva2硬解码及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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FFmpeg是一种开源的多媒体处理工具,其中包含了dxva2解码功能。DXVA2是DirectX Video Acceleration 2的缩写,它是一种能够充分利用显卡件加速的视频解码技术。 使用FFmpeg进行dxva2解码时,可以获得以下几个优势: 1. 提高解码效率:dxva2解码能够使用显卡的件加速能力,从而大大提高视频解码的效率。相较于软解码,在相同的件条件下,dxva2解码可以更快地完成对视频的解码工作。 2. 减轻CPU负担:由于dxva2解码利用显卡进行解码,可以减轻CPU的负担,从而为其他任务提供更多的计算资源。这对于同时进行多任务处理的用户来说,尤其是一些对计算性能要求较高的场景,是非常有益的。 3. 优化视频播放体验:dxva2解码可以提供更平滑和流畅的视频播放体验。它能够更好地处理高分辨率、高比特率的视频文件,避免视频卡顿或者出现掉帧的情况。 然而,dxva2解码也存在一些限制和要求: 1. 件支持要求:要使用dxva2解码功能,需要具备支持DXVA2的显卡件。不同显卡型号和厂商支持的dxva2版本可能会有所不同,所以在使用前需要确认自己的显卡是否支持dxva2解码。 2. FFmpeg版本要求:为了能够使用dxva2解码功能,需要使用支持dxva2FFmpeg版本。更新的FFmpeg版本通常会修复一些bug并加入新的功能,所以建议使用最新版本的FFmpeg。 总结来说,通过FFmpegdxva2解码功能,我们可以提高解码效率、减轻CPU负担,并获得更好的视频播放体验。需要注意的是,确保件和软件环境支持dxva2解码,并及时更新FFmpeg版本可以保证最佳的使用效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值