lzg0610210238 2017-09-07 07:36 采纳率: 16.7%
浏览 1959

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

  • 悟空悟静 2017-11-16 03:45
    关注

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

    评论

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog