summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJøger Hansegård <joger.hansegard@qt.io>2023-12-12 09:59:40 +0100
committerJøger Hansegård <joger.hansegard@qt.io>2023-12-13 19:53:00 +0100
commit2f99eaefc24ea1a0b8341a9e442a81a19f25b9a1 (patch)
tree7bd4d935528a5ea4ac21a0cff6897bfdbc6fd4f3
parentddf750681841f35abdc672a5c0aa9e0b5ba6c66d (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.cpp26
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";