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内部拷贝的功能可以保存解码线程中的数据?这样也实现了解码和绘图的分开。

1个回答

scu_hjq
scu_hjq   2017.11.16 11:45

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

scu_hjq
scu_hjq 还有个问题,我了解的gl渲染也就几个毫秒,为啥考虑放到不同线程?
3 天之前 回复
Csdn user default icon
上传中...
上传图片
插入图片