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个回答

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

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

debutguo
debut 回复悟空悟静: 楼主dxva解码部分的代码能不能发一个参考一下?
大约一年之前 回复
lzg0610210238
lzg0610210238 回复scu_hjq: 问题主要是因为解码太费时,不是渲染。
大约 2 年之前 回复
scu_hjq
悟空悟静 还有个问题,我了解的gl渲染也就几个毫秒,为啥考虑放到不同线程?
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问