标签: dxva

GPU去隔行扫描

我有一个应用程序,使用OpenGL进行颜色变换,缩放和翻译等视频处理.我主要使用BGRA(1xGL_BGRA)或YUVA(4xGL_R)视频,即包括alpha.

现在我还想做一些高质量的去隔行扫描.我注意到Nvidia通过其"PureVideo"功能支持高质量的硬件加速去隔行扫描.基本上我想要做的是发送带有x个颜色通道的隔行扫描OpenGL纹理,并获得两个渐进纹理.

我的问题是如何最简单,最有效地访问此功能(可能与OpenGL互操作)?

我一直在关注DXVA和OpenMax,但两者似乎都专注于播放(不是去隔行处理,即非相关选项,如帧速率需要设置等等)和无alpha格式......

c++ windows opengl openmax dxva

21
推荐指数
1
解决办法
3631
查看次数

如何在directx 11和Windows 7中使用硬件加速视频/ H.264解码?

我一整天都在研究,并没有走得太远.我在Windows 7上,使用directx 11.(我的最终输出是DX11纹理上的视频帧)我想解码一些非常大的H.264视频文件,而CPU(使用libav)则没有剪了它.

我已经看过了使用DXVA2的libav的hwaccel功能,但是当我需要创建一个IDirectXVideoDecoder时,它只能用一个D3D9接口来创建.(我没有使用DX11)

每当我查看DXVA文档时,它都没有引用DX11,是在DX10或11中删除了吗?(无法找到任何关于此的确认,也没有任何说明DXVA2是多余的,可能是它被DXVA-HD超越了吗?)

然后我查看了媒体基础SDK,因为它看起来像我应该用于DX11 ...但我的标题中没有类型(文档说只是包括,但这没有产生任何东西).他们还指定了最少的窗口8来使用它.

我相信使用MF我需要windows 8 SDK,它现在包含所有directx libs/headers.

因此,这与Windows 7存在差距...是否有可能获得硬件加速视频解码?如果是的话,我应该使用哪种API?

directx directx-11 h.264 hardware-acceleration dxva

13
推荐指数
1
解决办法
1万
查看次数

DirectShow,Media Foundation,DXVA,什么?

我的任务是修改一个使用DirectShow进行视频渲染的应用程序.旧的应用程序工作正常,但它开始显示年龄.

由于我有游戏背景,我想我应该这样做.在使用不同的技术制作了一堆原型之后,我非常确定我可以提取视频到纹理的渲染并使用DirectX来满足所有客户的请求.

但是,我现在已经到了必须选择一种技术的地步,我不能再迷失了......

  • DirectShow的
  • 媒体基金会
    • 媒体会话(<Windows 8)
    • 媒体引擎(> Windows 8)
  • DXVA1
  • DXVA2
  • DXVA-HD

DirectShow显然是最古老的,但仍然运行良好,也主要是因为可用的大量编解码器.

媒体基金会已经推出了Windows Vista,直到Windows 8还有一个名为"媒体会话"的东西,之后他们推出了"媒体引擎".如果我是正确的编解码器被称为MFT?实际上有哪些网站可以像free-codecs.com一样提供这些网站?

除了这两种技术之外,还有DXVA,它允许您将视频解码卸载到GPU.目前,我遇到了3种不同的类型.DXVA1是自XP以来一直存在的实现,DXVA2是更新的API.但什么是DXVA-HD?它比DXVA2更新还是同等名称?

我真的想转向媒体基金会,开箱即用的编解码器非常适合客户想要使用的格式.我所关心的是为它获取编解码器是多么容易...... Windows 8+默认媒体播放器是否仍然具有DirectShow和MF渲染路径并且可以即时交换它们还是微软完全逐步淘汰DirectShow?

我也无法完全理解DXVA应该如何工作.鉴于我想基本上在游戏中渲染视频,只有让所有渲染实际发生在GPU上并将应用程序逻辑保留在CPU上才有意义,但我真的找不到任何关于如何使用Media的好例子基础.这主要是因为我不知道DXVA2和DXVA-HD之间的区别.Windows 7 SDK附带了所有3个实现的示例......

如果有人能够以粗体回答我的问题,请纠正我的错误信息,并指出我正确的方向(DirectX + Media Foundation + DXVA-无论如何),我将非常感激!它可以像"结合Windows 7 SDK的这3个示例来获得您想要的"一样简单.

整个任务的目标是再次获得顶级形式的应用程序,我想绝对肯定我会选择像DirectShow已经拥有的下一个十年的技术:P

directx video directshow dxva ms-media-foundation

7
推荐指数
1
解决办法
1538
查看次数

C++ DXVA库"操作失败,因为DDC/CI消息在其命令字段中具有无效值."

我正在尝试创建一个C++控制台应用程序,它将根据屏幕上显示的像素的平均亮度自动调整显示器的亮度.不幸的是,在我进入第二部分之前,我甚至无法使用DXVA库.

这是我当前的代码(我从这里采用了一些代码:如何使用GetMonitorCapabilities和GetMonitorBrightness函数):

#include "stdafx.h"
#include <iostream>

#include <Windows.h>
#include <WinUser.h>
#include <physicalmonitorenumerationapi.h>
#include <highlevelmonitorconfigurationapi.h>
#include <strsafe.h>

std::string GetLastErrorAsString()
{
    DWORD errorMessageID = ::GetLastError();
    if (errorMessageID == 0)
        return std::string();

    LPSTR messageBuffer = nullptr;
    size_t size = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
        NULL, errorMessageID, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&messageBuffer, 0, NULL);

    std::string message(messageBuffer, size);
    LocalFree(messageBuffer);

    return message;
}

int main()
{
    HWND hWnd = GetDesktopWindow();
    HMONITOR hMonitor = MonitorFromWindow(hWnd, MONITOR_DEFAULTTOPRIMARY);
    DWORD cPhysicalMonitors = 0;

    BOOL bSuccess = GetNumberOfPhysicalMonitorsFromHMONITOR(hMonitor, &cPhysicalMonitors);
    if (!bSuccess) …
Run Code Online (Sandbox Code Playgroud)

c++ dxva

7
推荐指数
0
解决办法
158
查看次数

如何使用Direct3D设备管理器?

我想在Direct3D应用程序中的多个线程和对象之间共享一个Direct3D设备.我遇到了Direct3D设备管理器,它看起来像我想要的,虽然我没有做任何视频处理或视频加速:http: //msdn.microsoft.com/en-us/library/windows/desktop/aa965267( v = vs.85)的.aspx

在我的代码中,我正在做以下事情:

  // Create the device manager
  UINT resetToken = 0;
  IDirect3DDeviceManager9* deviceManager = NULL;
  if (FAILED(DXVA2CreateDirect3DDeviceManager9(&resetToken, &deviceManager)))
    return false;

  // Add the device to the device manager
  if (FAILED(deviceManager->ResetDevice(device, resetToken)))
    return false;

  deviceManager->AddRef();
Run Code Online (Sandbox Code Playgroud)

我的问题是,一旦我创建了Direct3D设备管理器,如何在不传递指向设备管理器的指针的情况下与其他对象共享direct3d设备管理器?微软已经明确表示会做以下事情,但我不知道以下内容的真正含义:

设备所有者必须为其他对象提供一种获取指向IDirect3DDeviceManager9接口的指针的方法.标准机制是实现IMFGetService接口.服务GUID是MR_VIDEO_ACCELERATION_SERVICE.

有人可以告诉我如何使用IMFGetService接口共享设备管理器吗?

c++ direct3d direct3d9 dxva ms-media-foundation

6
推荐指数
1
解决办法
1792
查看次数

使用dxva解码h264视频

我正在开发一个需要使用dxva2.0解码h264视频的项目.我根据文档http://msdn.microsoft.com/en-us/library/windows/desktop/aa965245%28v=vs.85%29.aspx编写代码.也就是说,我创建了一个IDirectXVideoDecoder的接口,然后我调用了dxva api"BeginFrame","Execute"和"EndFrame".然后问题出来了.当我在Intel Core i5 CPU上执行我的程序(GPU是CPU内部的Intel HD图形)时,一切正常.但是当我在intel ATOM处理器(使用intel GMA3000系列图形硬件)上执行它时,我无法得到正确的结果:一些视频帧被正确解码,而其他视频帧完全混乱.我使用的数据是从另一台计算机发送的,数据可以直接填充到dxva的缓冲区.在h264中,缓冲区是DXVA2_PictureParameter,DXVA2_Bitstream,DXVA2_InverseQuantization和DXVA2_SliceControl.所以没有必要使用ffmpeg或ffdshow(而ffdshow是gpl,我不能使用它)."dxva checker"软件告诉我,intel core i5的指南是"ModeH264_VLD_NoFGT_ClearVideo",而intel atom的指针是"ModeH264_VLD_NoFGT".我想知道两个guids之间的区别.是否可以在intel视频卡上使用"ModeH264_VLD_NoFGT"来解码视频?

windows dxva

6
推荐指数
0
解决办法
2368
查看次数

使用DirectX视频加速(DXVA)实现媒体基础转换(MFT)

目的是实现用于视频处理和与外部应用程序同步的自定义MFT.细节并不重要.我想要实现的第一步是使用DXVA视频处理或DXVA-HD启动和运行MFT.我无法这样做.

这就是我所做的:我开始使用源输入节点(我的网络摄像头),MFT(MFT_Grayscale示例)和EVR构建拓扑.我把它包含在一个小应用程序中.拓扑工作,我可以看到相机的单色流.现在我想更改MF_Grayscale示例的代码,使其支持DXVA视频处理,并可以使用VideoProcessBlt方法提供的硬件加速.Microsoft文档提供了一些信息,但我无法实现正在运行的MFT.

到目前为止我做了什么:

pStreamInfo->dwFlags = MFT_OUTPUT_STREAM_PROVIDES_SAMPLES | MFT_OUTPUT_STREAM_WHOLE_SAMPLES | MFT_OUTPUT_STREAM_SINGLE_SAMPLE_PER_BUFFER | MFT_OUTPUT_STREAM_FIXED_SAMPLE_SIZE;

直到这里,一切似乎都还可以.现在我的问题(对不起,我不能更具体):

  • 我必须调整GetOutputAvailableType/SetOutputType方法吗?

  • ProcessInput方法中我得到IMFSample并提取了一个IMFMediaBuffer.缓冲区不管理IDirect3DSurface9我的函数调用.我是否必须将缓冲区的数据存储到Direct3D表面?

  • ProcessOutput制作起点的方法中,我想将输入帧转发到输出.VideoProcessBlt从输入到输出应该是1:1的blit.文件说:

    获取当前未使用的可用表面.

如何确定表面是否正在使用?

  • 我怎么输出表面?我应该使用MFCreateVideoSampleFromSurfaceMFCreateDXSurfaceBuffer

  • 不幸的是,我真的迷路了,无法使用文档取得任何进展.

现在的情况是我没有看到任何视频输出(窗口有其默认的窗口背景颜色),并且网络摄像头在第一帧(LED关闭后)停止捕获帧.除此之外没有任何反应 - 应用程序只是继续运行而没有显示任何内容.

我希望有人可以帮助我.如果有人能指导我使用DXVA视频处理或DXVA-HD进行MFT的示例代码,我将不胜感激.我找不到任何东西......

谢谢

c++ dxva ms-media-foundation

6
推荐指数
1
解决办法
2170
查看次数

带有7个后缓冲区的DirectX 11 Swap Chain

我有一个在桌面模式下在Windows 8上运行的专有媒体播放器.运行时DirectX版本是11,但本机图形驱动程序支持适用于DirectX 9.
在一些具有完全相同设置的计算机上,我看到实际交换链的后缓冲区计数为2,性能很好,而在其他一些计算机上缓冲区计数为7,并且有帧丢弃.
我没有该播放器的源代码,并想知道在运行时确定不同后台缓冲区计数的原因是什么.
有人可以解释为什么这样的后备缓冲计数导致性能的这种变化?或者只是向我指出解释反向缓冲区数量影响的相关文档?

(更多调试信息:使用GPUView我看到当后备缓冲计数为2时,硬件以同步模式工作,即每秒VSync中的一个数据包在HW队列中(Clip帧速率为30fps),对于7个后备缓冲区,工作是一起完成5-7帧,然后一些空VSyncs,然后再5-7帧,依此类推).

先感谢您!

directx performance directx-11 windows-8 dxva

5
推荐指数
2
解决办法
2696
查看次数