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

  • 问题

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

    2017年9月7日 8:13

全部回复