zoukankan      html  css  js  c++  java
  • 基于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;
    }
    
  • 相关阅读:
    HEOI2017游记
    uoj228:基础数据结构练习题
    bzoj1494【Noi2007】生成树计数
    bzoj1975【Sdoi2010】魔法猪学院
    bzoj2957:楼房重建
    uoj169:元旦老人与数列
    bzoj2178:圆的面积并
    一道好题
    Codeforces Round #440(Div.2)
    Codeforces Round #439 (Div. 2)
  • 原文地址:https://www.cnblogs.com/huluwa508/p/10304442.html
Copyright © 2011-2022 走看看