diff options
author | Jøger Hansegård <joger.hansegard@qt.io> | 2023-12-12 09:59:40 +0100 |
---|---|---|
committer | Jøger Hansegård <joger.hansegard@qt.io> | 2023-12-13 19:53:00 +0100 |
commit | 2f99eaefc24ea1a0b8341a9e442a81a19f25b9a1 (patch) | |
tree | 7bd4d935528a5ea4ac21a0cff6897bfdbc6fd4f3 | |
parent | ddf750681841f35abdc672a5c0aa9e0b5ba6c66d (diff) |
Revert "Avoid skipping frames with windows media player"
Although the proposed fix appeared to mitigate the issue in some video
files, more testing revealed that frame jumping got worse in other video
files. This shows that creating texture copies did not solve the root
cause of the problem.
This reverts commit 78c79152bcfda43187cf77d913d887045e14b6bf.
Task-number: QTBUG-117099
Pick-to: 6.7 6.6 6.5
Change-Id: Ifcb4ca6815e151ce6907500f4de0974eb9976e0e
Reviewed-by: Artem Dyomin <artem.dyomin@qt.io>
Reviewed-by: Vladimir Belyavsky <belyavskyv@gmail.com>
-rw-r--r-- | src/plugins/multimedia/windows/evr/evrd3dpresentengine.cpp | 26 |
1 files changed, 5 insertions, 21 deletions
diff --git a/src/plugins/multimedia/windows/evr/evrd3dpresentengine.cpp b/src/plugins/multimedia/windows/evr/evrd3dpresentengine.cpp index 1c026b260..cc14cd419 100644 --- a/src/plugins/multimedia/windows/evr/evrd3dpresentengine.cpp +++ b/src/plugins/multimedia/windows/evr/evrd3dpresentengine.cpp @@ -152,13 +152,11 @@ public: if (!dev) return {}; - ComPtr<ID3D11Texture2D> sampleTexture; - HRESULT hr = dev->OpenSharedResource(m_sharedHandle, IID_PPV_ARGS(&sampleTexture)); - + ComPtr<ID3D11Texture2D> d3d11tex; + HRESULT hr = dev->OpenSharedResource(m_sharedHandle, __uuidof(ID3D11Texture2D), (void**)(d3d11tex.GetAddressOf())); if (SUCCEEDED(hr)) { - D3D11_TEXTURE2D_DESC desc = {}; - sampleTexture->GetDesc(&desc); + d3d11tex->GetDesc(&desc); QRhiTexture::Format format; if (desc.Format == DXGI_FORMAT_B8G8R8A8_UNORM) format = QRhiTexture::BGRA8; @@ -167,23 +165,9 @@ public: else return {}; - // Copy the media sample's texture to a local texture to prevent - // WMF from overwriting the texture before it has been presented. - // This can result in a texture allocation per frame, but D3D seems - // to be good at hiding this overhead. It is not unlikely that - // D3D already uses internal caches to reduce the allocation cost. - ComPtr<ID3D11Texture2D> frameTexture; - hr = dev->CreateTexture2D(&desc, nullptr, frameTexture.GetAddressOf()); - if (hr != S_OK) - return {}; - - ComPtr<ID3D11DeviceContext> context; - dev->GetImmediateContext(context.GetAddressOf()); - context->CopyResource(frameTexture.Get(), sampleTexture.Get()); - std::unique_ptr<QRhiTexture> tex(rhi->newTexture(format, QSize{int(desc.Width), int(desc.Height)}, 1, {})); - tex->createFrom({ quint64(frameTexture.Get()), 0 }); - return std::make_unique<QVideoFrameD3D11Textures>(std::move(tex), std::move(frameTexture)); + tex->createFrom({quint64(d3d11tex.Get()), 0}); + return std::make_unique<QVideoFrameD3D11Textures>(std::move(tex), std::move(d3d11tex)); } else { qCDebug(qLcEvrD3DPresentEngine) << "Failed to obtain D3D11Texture2D from D3D9Texture2D handle"; |