2 lzg0610210238 lzg0610210238 于 2017.09.07 15:36 提问

DXVA2 native硬解码后数据如何和opengl绘图在不同线程进行

背景:
1. 对4K高清视频的播放目前采用的方案是DXVA2 native硬解码+opengl glsl绘图。
2. DXVA2 硬解码后数据不拷贝回cpu内存,直接传递给opengl绘图。

问题:
目前的方法中解码后数据因为IDirect3DSurface9_LockRect和IDirect3DSurface9_UnLockRect无法传递到该函数外部,只能在解码后立即调用opengl绘图。

目前的实现代码:

 static int dxva2_retrieve_data(AVCodecContext *s, AVFrame *frame)
{
   LPDIRECT3DSURFACE9 surface =  (LPDIRECT3DSURFACE9)frame->data[3];
   InputStream        *ist = (InputStream *)s->opaque;
   DXVA2Context       *ctx = (DXVA2Context*)ist->hwaccel_ctx;
   D3DSURFACE_DESC    surfaceDesc;
   D3DLOCKED_RECT     LockedRect;
   HRESULT            hr;
   int                ret;

   IDirect3DSurface9_GetDesc(surface, &surfaceDesc);
   hr = IDirect3DSurface9_LockRect(surface, &LockedRect, NULL, D3DLOCK_READONLY);
   if (FAILED(hr)) {
     av_log(NULL, AV_LOG_ERROR, "Unable to lock DXVA2 surface\n");
     return AVERROR_UNKNOWN;
   }
   picture->data[0] = (uint8_t*)LockedRect.pBits;
   picture->data[1] = (uint8_t*)LockedRect.pBits + LockedRect.Pitch * surfaceDesc.Height;
   frameWidth = frame->width;
   frameHeight = frame->height;
   //opengl draw start
    Draw();
   //opengl draw end
   picture->data[0] = nullptr;
   picture->data[1] = nullptr;
   IDirect3DSurface9_UnlockRect(surface);
   return 0;
}

期望:
1. 想把DXVA解码和opengl绘图分开到不同线程中,想知道是否有方法将DXVA2解码后数据传递到不同线程中?
2. 利用DXVA是否有gpu内部拷贝的功能可以保存解码线程中的数据?这样也实现了解码和绘图的分开。

2个回答

lzg0610210238
lzg0610210238   2018.05.04 09:01

谢谢。最后通过Intel的SSE4指令集,将数据从GPU中拷贝会CPU解决了此问题。
目前对于播放4k分辨率的视频没有问题。

scu_hjq
scu_hjq   2017.11.16 11:45

我觉得可以,是否与wglMakeCurrent作用类似。

lzg0610210238
lzg0610210238 回复scu_hjq: 问题主要是因为解码太费时,不是渲染。
3 个月之前 回复
scu_hjq
scu_hjq 还有个问题,我了解的gl渲染也就几个毫秒,为啥考虑放到不同线程?
8 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
基于dxva2的ffmpeg硬解码实现
windows上进行视频播放通常有两种选择,一个是借助于vlc等开源播放器,直接写成一个播放器;另外一个选择就是使用开源的ffmpeg库(libav)来完成视频的读取和解码,然后利用sdl或者dx等渲染组件进行渲染播放。咱们今天的主角就是ffmpeg,为什么说是ffmpeg呢?不是dxva吗?其实ffmpeg已经集成了dxva的支持,可以很方便的调用以便用来进行视频解码。下面我们来看一下"DXVA
如何快速实现ffmpeg dxva2硬解码
首先,ffmpeg本身支持dxva2硬结解码,但解码器类型有限,并不是所有的都可以硬解。我使用的ffmpeg的版本是3.2,支持dxva2硬件加速的有以下几种文件格式: AV_CODEC_ID_MPEG2VIDEO、AV_CODEC_ID_H264、AV_CODEC_ID_VC1、AV_CODEC_ID_WMV3、AV_CODEC_ID_HEVC、AV_CODEC_ID_VP9。 在正常软解代
GPU硬解码---DXVA
前面介绍利用NVIDIA公司提供的CUVID库进行视频硬解码,下面将介绍利用DXVA进行硬解码。 一、DXVA介绍    DXVA是微软公司专门定制的视频加速规范,是一种接口规范。DXVA规范制定硬件加速解码可分四级:VLD,控制BitStream;IDCT,反余弦变换;Mocomp,运动补偿,Pixel Prediction;PostProc,显示后处理。其中,VLD加速等级最高,所
解决windows 7下ffmpeg dxva2硬解码速度过慢
由于项目要兼顾Win 7和Win 10,故将硬解的代码放到Win 7上跑了一下,居然发现视频一直在同步音频,且视频播放卡顿。查到最后发现是由于 av_image_copy_plane()函数执行时间过久,在我的i7-6700K上,拷贝一帧需要50+ms,这是不能接受的。 想到qtav有一个优化拷贝的选项,故将其代码download下看了看,copytoFrame()函数原型如下:
ffmpeg使用dxva2硬解码DEMO(vs2010)
基于VS2010的工程,实现dxva2的硬件加速功能,需要更改一下工程中的视频文件路径。亲测可以用。
DXVA硬件加速解码
一、DXVA介绍 DXVA是微软公司专门定制的视频加速规范,是一种接口规范。DXVA规范制定硬件加速解码可分四级:VLD,控制BitStream;IDCT,反余弦变换;Mocomp,运动补偿,Pixel Prediction;PostProc,显示后处理。其中,VLD加速等级最高,所以其包含IDCT、MoCoopm和PostProc;IDCT加速次之,包含MoCoopm和PostProc;最
对Dxva2解码数据进行简单图像处理
利用HLSL实现对DXVA2解码数据的简单处理,内含高斯滤波,中值滤波,USM锐化,以及点运算的例子
【视频开发】GPU编解码:GPU硬解码---DXVA
GPU编解码:GPU硬解码---DXVA    一、DXVA介绍   DXVA是微软公司专门定制的视频加速规范,是一种接口规范。DXVA规范制定硬件加速解码可分四级:VLD,控制BitStream;IDCT,反余弦变换;Mocomp,运动补偿,Pixel Prediction;PostProc,显示后处理。其中,VLD加速等级最高,所以其包含IDCT、MoCoopm和Pos
如何在Directshow中使用硬解码功能
    在Directshow中使用硬解码一般通过DXVA技术,这是微软针对Windows系统定义的硬件加速解码的一个标准接口,目前很多显卡厂商已经实现了。通过DXVA接口,我们以一种统一的接口形式访问各种显卡的硬件加速(解码)功能,还可以通过API接口设置参数来控制解码的一些流程。但这篇博文不是给大家讲怎么用DXVA API来解码视频,而是介绍另外一种简单的方法:通过LAV Video Deco...
DXVA -- VDPAU -- CUVID -- VAAPI
// DXVA常见问题论坛 http://www.codecguide.com/faq_dxva.htm // DXVA简介 http://blog.csdn.net/xuxinhua/article/details/7221995 // 高清视频相关知识和 KMPlayer 硬解码(DXVA)设置 http://wenku.baidu.com/link?url=ln