我使用硬件加速从IDirect3DSurface9
视频解码器中获得了DXVA2
。
我尝试通过其手柄在“我的窗口”上渲染此硬件IDirect3DSurface9
。以下是我的摘要代码。
首先,我叫dxva2_init(AVCodecContext *s, HWND hwnd)
; hwnd
是窗口的句柄
int dxva2_init(AVCodecContext *s, HWND hwnd)
{
InputStream *ist = (InputStream *)s->opaque;
int loglevel = (ist->hwaccel_id == HWACCEL_AUTO) ? AV_LOG_VERBOSE : AV_LOG_ERROR;
DXVA2Context *ctx;
int ret;
if (!ist->hwaccel_ctx) {
ret = dxva2_alloc(s);
if (ret < 0)
return ret;
}
ctx = (DXVA2Context *)ist->hwaccel_ctx;
ctx->deviceHandle = hwnd;
if (s->codec_id == AV_CODEC_ID_H264 &&
(s->profile & ~FF_PROFILE_H264_CONSTRAINED) > FF_PROFILE_H264_HIGH) {
av_log(NULL, loglevel, "Unsupported H.264 profile for DXVA2 HWAccel: %d\n", s->profile);
return AVERROR(EINVAL);
}
if (ctx->decoder)
dxva2_destroy_decoder(s);
ret = dxva2_create_decoder(s);
if (ret < 0) {
av_log(NULL, loglevel, "Error creating the DXVA2 decoder\n");
return ret;
}
return 0;
}
解码成功后,我得到了IDirect3DSurface9
,并通过以下函数对其进行渲染。
int dxva2_render(AVCodecContext *s, AVFrame *frame)
{
LPDIRECT3DSURFACE9 surface = (LPDIRECT3DSURFACE9)frame->data[3];
InputStream *ist = (InputStream *)s->opaque;
DXVA2Context *ctx = (DXVA2Context *)ist->hwaccel_ctx;
try
{
lockRenderCS.Enter();
HRESULT hr = ctx->d3d9device->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(255, 0, 0), 1.0f, 0);
if (hr != D3D_OK)
return 0;
hr = ctx->d3d9device->BeginScene();
if (hr != D3D_OK)
return 0;
hr = ctx->d3d9device->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &pBackBuffer);
if (hr != D3D_OK)
return 0;
hr = ctx->d3d9device->StretchRect(surface, NULL, pBackBuffer, NULL, D3DTEXF_LINEAR);
if (hr != D3D_OK)
return 0;
hr = ctx->d3d9device->EndScene();
if (hr != D3D_OK)
return 0;
hr = ctx->d3d9device->Present(NULL, NULL, NULL, NULL);
if (hr != D3D_OK)
return 0;
}
finally
{
lockRenderCS.Leave();
}
return 0;
}
注意:以上所有Clear(), BeginScene(), GetBackBuffer(), StretchRect(), EndScene(), Present()
的D3D函数均已返回成功。但是框架没有显示在“我的窗口”上。
我猜想,我想念一些与DXVA2Context
集成的My Window Handle的代码。在此代码中,我仅在函数ctx->deviceHandle = hwnd;
中分配:dxva2_init()
。
我搜索了很多次,但是到目前为止我仍然找不到解决方案,有人可以帮助我吗?
非常感谢!
答案 0 :(得分:0)
我可以提供完整的代码。
没有完整的代码,我建议您像这样检查一下StretchRect的使用:
StretchRect限制
例如,我们不了解您的d3d9device / surface9(创建/初始化/参数/等...)一事。
此外,您可以从我的项目中研究此代码以进行dxva2解码: