首页 新闻 会员 周边 捐助

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

0
悬赏园豆:5 [待解决问题]

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

lzgnanjing的主页 lzgnanjing | 初学一级 | 园豆:197
提问于:2017-09-07 16:38
< >
分享
所有回答(1)
0

虽然问题很久很久了。。。建议可以参考这篇文章,直接用d3d9渲染
https://www.cnblogs.com/qq70565912/articles/15260544.html

自吹自擂 | 园豆:202 (菜鸟二级) | 2024-01-10 09:33
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册