diff options
author | Jøger Hansegård <joger.hansegard@qt.io> | 2023-06-07 14:38:22 +0200 |
---|---|---|
committer | Jøger Hansegård <joger.hansegard@qt.io> | 2023-06-12 23:11:39 +0200 |
commit | c06008c8b17d9d0d28810f29038cd038061649f1 (patch) | |
tree | 0ecfc71dda92111568ea1e458d15b5318151a6f5 /src/plugins/multimedia/windows/evr/evrd3dpresentengine.cpp | |
parent | 186d9b5a8d452bbc79274db04fedfb4647240964 (diff) |
Replace QComPtr with Microsoft's WRL::ComPtr in QtMultimedia
This way we can rely on a 'standard' implementation that behaves the
same way as other COM smart pointers, and we don't have to maintain our
own implementation any longer.
This also fixes a latent bug that could cause double release when facing
circular dependencies between COM objects.
Change-Id: I339faac2f5045c0379b61ad72be033510eca4958
Reviewed-by: Lars Knoll <lars@knoll.priv.no>
Reviewed-by: Pavel Dubsky <pavel.dubsky@qt.io>
(cherry picked from commit a93ee88315035c366d87e1bc2e07ddd24e67ffb9)
Diffstat (limited to 'src/plugins/multimedia/windows/evr/evrd3dpresentengine.cpp')
-rw-r--r-- | src/plugins/multimedia/windows/evr/evrd3dpresentengine.cpp | 90 |
1 files changed, 45 insertions, 45 deletions
diff --git a/src/plugins/multimedia/windows/evr/evrd3dpresentengine.cpp b/src/plugins/multimedia/windows/evr/evrd3dpresentengine.cpp index 1c2c2c1aa..5b45d22cb 100644 --- a/src/plugins/multimedia/windows/evr/evrd3dpresentengine.cpp +++ b/src/plugins/multimedia/windows/evr/evrd3dpresentengine.cpp @@ -30,7 +30,7 @@ static Q_LOGGING_CATEGORY(qLcEvrD3DPresentEngine, "qt.multimedia.evrd3dpresenten class IMFSampleVideoBuffer: public QAbstractVideoBuffer { public: - IMFSampleVideoBuffer(QComPtr<IDirect3DDevice9Ex> device, + IMFSampleVideoBuffer(ComPtr<IDirect3DDevice9Ex> device, IMFSample *sample, QRhi *rhi, QVideoFrame::HandleType type = QVideoFrame::NoHandle) : QAbstractVideoBuffer(type, rhi) , m_device(device) @@ -58,24 +58,24 @@ public: return {}; } else { - QComPtr<IMFMediaBuffer> buffer; - HRESULT hr = m_sample->GetBufferByIndex(0, buffer.address()); + ComPtr<IMFMediaBuffer> buffer; + HRESULT hr = m_sample->GetBufferByIndex(0, buffer.GetAddressOf()); if (FAILED(hr)) return {}; - QComPtr<IDirect3DSurface9> surface; - hr = MFGetService(buffer.get(), MR_BUFFER_SERVICE, IID_IDirect3DSurface9, (void **)(surface.address())); + ComPtr<IDirect3DSurface9> surface; + hr = MFGetService(buffer.Get(), MR_BUFFER_SERVICE, IID_IDirect3DSurface9, (void **)(surface.GetAddressOf())); if (FAILED(hr)) return {}; if (FAILED(surface->GetDesc(&desc))) return {}; - if (FAILED(m_device->CreateOffscreenPlainSurface(desc.Width, desc.Height, desc.Format, D3DPOOL_SYSTEMMEM, m_memSurface.address(), nullptr))) + if (FAILED(m_device->CreateOffscreenPlainSurface(desc.Width, desc.Height, desc.Format, D3DPOOL_SYSTEMMEM, m_memSurface.GetAddressOf(), nullptr))) return {}; - if (FAILED(m_device->GetRenderTargetData(surface.get(), m_memSurface.get()))) { - m_memSurface.reset(); + if (FAILED(m_device->GetRenderTargetData(surface.Get(), m_memSurface.Get()))) { + m_memSurface.Reset(); return {}; } } @@ -105,18 +105,18 @@ public: } protected: - QComPtr<IDirect3DDevice9Ex> m_device; - QComPtr<IMFSample> m_sample; + ComPtr<IDirect3DDevice9Ex> m_device; + ComPtr<IMFSample> m_sample; private: - QComPtr<IDirect3DSurface9> m_memSurface; + ComPtr<IDirect3DSurface9> m_memSurface; QVideoFrame::MapMode m_mapMode; }; class QVideoFrameD3D11Textures: public QVideoFrameTextures { public: - QVideoFrameD3D11Textures(std::unique_ptr<QRhiTexture> &&tex, QComPtr<ID3D11Texture2D> &&d3d11tex) + QVideoFrameD3D11Textures(std::unique_ptr<QRhiTexture> &&tex, ComPtr<ID3D11Texture2D> &&d3d11tex) : m_tex(std::move(tex)) , m_d3d11tex(std::move(d3d11tex)) {} @@ -128,13 +128,13 @@ public: private: std::unique_ptr<QRhiTexture> m_tex; - QComPtr<ID3D11Texture2D> m_d3d11tex; + ComPtr<ID3D11Texture2D> m_d3d11tex; }; class D3D11TextureVideoBuffer: public IMFSampleVideoBuffer { public: - D3D11TextureVideoBuffer(QComPtr<IDirect3DDevice9Ex> device, IMFSample *sample, + D3D11TextureVideoBuffer(ComPtr<IDirect3DDevice9Ex> device, IMFSample *sample, HANDLE sharedHandle, QRhi *rhi) : IMFSampleVideoBuffer(std::move(device), sample, rhi, QVideoFrame::RhiTextureHandle) , m_sharedHandle(sharedHandle) @@ -153,8 +153,8 @@ public: if (!dev) return {}; - QComPtr<ID3D11Texture2D> d3d11tex; - HRESULT hr = dev->OpenSharedResource(m_sharedHandle, __uuidof(ID3D11Texture2D), (void**)(d3d11tex.address())); + ComPtr<ID3D11Texture2D> d3d11tex; + HRESULT hr = dev->OpenSharedResource(m_sharedHandle, __uuidof(ID3D11Texture2D), (void**)(d3d11tex.GetAddressOf())); if (SUCCEEDED(hr)) { D3D11_TEXTURE2D_DESC desc = {}; d3d11tex->GetDesc(&desc); @@ -167,7 +167,7 @@ public: return {}; std::unique_ptr<QRhiTexture> tex(rhi->newTexture(format, QSize{int(desc.Width), int(desc.Height)}, 1, {})); - tex->createFrom({quint64(d3d11tex.get()), 0}); + tex->createFrom({quint64(d3d11tex.Get()), 0}); return std::make_unique<QVideoFrameD3D11Textures>(std::move(tex), std::move(d3d11tex)); } else { @@ -287,7 +287,7 @@ private: class OpenGlVideoBuffer: public IMFSampleVideoBuffer { public: - OpenGlVideoBuffer(QComPtr<IDirect3DDevice9Ex> device, IMFSample *sample, + OpenGlVideoBuffer(ComPtr<IDirect3DDevice9Ex> device, IMFSample *sample, const WglNvDxInterop &wglNvDxInterop, HANDLE sharedHandle, QRhi *rhi) : IMFSampleVideoBuffer(std::move(device), sample, rhi, QVideoFrame::RhiTextureHandle) , m_sharedHandle(sharedHandle) @@ -297,29 +297,29 @@ public: std::unique_ptr<QVideoFrameTextures> mapTextures(QRhi *rhi) override { if (!m_texture) { - QComPtr<IMFMediaBuffer> buffer; - HRESULT hr = m_sample->GetBufferByIndex(0, buffer.address()); + ComPtr<IMFMediaBuffer> buffer; + HRESULT hr = m_sample->GetBufferByIndex(0, buffer.GetAddressOf()); if (FAILED(hr)) return {}; - QComPtr<IDirect3DSurface9> surface; - hr = MFGetService(buffer.get(), MR_BUFFER_SERVICE, IID_IDirect3DSurface9, - (void **)(surface.address())); + ComPtr<IDirect3DSurface9> surface; + hr = MFGetService(buffer.Get(), MR_BUFFER_SERVICE, IID_IDirect3DSurface9, + (void **)(surface.GetAddressOf())); if (FAILED(hr)) return {}; - hr = surface->GetContainer(IID_IDirect3DTexture9, (void **)m_texture.address()); + hr = surface->GetContainer(IID_IDirect3DTexture9, (void **)m_texture.GetAddressOf()); if (FAILED(hr)) return {}; } - return QVideoFrameOpenGlTextures::create(m_wgl, rhi, m_device.get(), m_texture.get(), m_sharedHandle); + return QVideoFrameOpenGlTextures::create(m_wgl, rhi, m_device.Get(), m_texture.Get(), m_sharedHandle); } private: HANDLE m_sharedHandle = nullptr; WglNvDxInterop m_wgl; - QComPtr<IDirect3DTexture9> m_texture; + ComPtr<IDirect3DTexture9> m_texture; }; #endif @@ -343,9 +343,9 @@ void D3DPresentEngine::setSink(QVideoSink *sink) m_sink = sink; releaseResources(); - m_device.reset(); - m_devices.reset(); - m_D3D9.reset(); + m_device.Reset(); + m_devices.Reset(); + m_D3D9.Reset(); if (!m_sink) return; @@ -363,10 +363,10 @@ void D3DPresentEngine::setSink(QVideoSink *sink) HRESULT D3DPresentEngine::initializeD3D() { - HRESULT hr = Direct3DCreate9Ex(D3D_SDK_VERSION, m_D3D9.address()); + HRESULT hr = Direct3DCreate9Ex(D3D_SDK_VERSION, m_D3D9.GetAddressOf()); if (SUCCEEDED(hr)) - hr = DXVA2CreateDirect3DDeviceManager9(&m_deviceResetToken, m_devices.address()); + hr = DXVA2CreateDirect3DDeviceManager9(&m_deviceResetToken, m_devices.GetAddressOf()); return hr; } @@ -440,7 +440,7 @@ HRESULT D3DPresentEngine::createD3DDevice() QRhi *rhi = m_sink ? m_sink->rhi() : nullptr; if (rhi) { if (rhi->backend() == QRhi::D3D11) { - m_useTextureRendering = findD3D11AdapterID(*rhi, m_D3D9.get(), adapterID); + m_useTextureRendering = findD3D11AdapterID(*rhi, m_D3D9.Get(), adapterID); #if QT_CONFIG(opengl) } else if (rhi->backend() == QRhi::OpenGLES2) { m_useTextureRendering = readWglNvDxInteropProc(m_wglNvDxInterop); @@ -481,7 +481,7 @@ HRESULT D3DPresentEngine::createD3DDevice() pp.Flags = D3DPRESENTFLAG_VIDEO; pp.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT; - QComPtr<IDirect3DDevice9Ex> device; + ComPtr<IDirect3DDevice9Ex> device; hr = m_D3D9->CreateDeviceEx( adapterID, @@ -490,7 +490,7 @@ HRESULT D3DPresentEngine::createD3DDevice() vp | D3DCREATE_NOWINDOWCHANGES | D3DCREATE_MULTITHREADED | D3DCREATE_FPU_PRESERVE, &pp, NULL, - device.address() + device.GetAddressOf() ); if (FAILED(hr)) return hr; @@ -499,7 +499,7 @@ HRESULT D3DPresentEngine::createD3DDevice() if (FAILED(hr)) return hr; - hr = m_devices->ResetDevice(device.get(), m_deviceResetToken); + hr = m_devices->ResetDevice(device.Get(), m_deviceResetToken); if (FAILED(hr)) return hr; @@ -509,7 +509,7 @@ HRESULT D3DPresentEngine::createD3DDevice() bool D3DPresentEngine::isValid() const { - return m_device.get() != nullptr; + return m_device.Get() != nullptr; } void D3DPresentEngine::releaseResources() @@ -525,7 +525,7 @@ HRESULT D3DPresentEngine::getService(REFGUID, REFIID riid, void** ppv) if (!m_devices) { hr = MF_E_UNSUPPORTED_SERVICE; } else { - *ppv = m_devices.get(); + *ppv = m_devices.Get(); m_devices->AddRef(); } } else { @@ -603,24 +603,24 @@ HRESULT D3DPresentEngine::createVideoSamples(IMFMediaType *format, QList<IMFSamp for (int i = 0; i < PRESENTER_BUFFER_COUNT; i++) { // texture ref cnt is increased by GetSurfaceLevel()/MFCreateVideoSampleFromSurface() // below, so it will be destroyed only when the sample pool is released. - QComPtr<IDirect3DTexture9> texture; + ComPtr<IDirect3DTexture9> texture; HANDLE sharedHandle = nullptr; - hr = m_device->CreateTexture(width, height, 1, D3DUSAGE_RENDERTARGET, (D3DFORMAT)d3dFormat, D3DPOOL_DEFAULT, texture.address(), &sharedHandle); + hr = m_device->CreateTexture(width, height, 1, D3DUSAGE_RENDERTARGET, (D3DFORMAT)d3dFormat, D3DPOOL_DEFAULT, texture.GetAddressOf(), &sharedHandle); if (FAILED(hr)) break; - QComPtr<IDirect3DSurface9> surface; - hr = texture->GetSurfaceLevel(0, surface.address()); + ComPtr<IDirect3DSurface9> surface; + hr = texture->GetSurfaceLevel(0, surface.GetAddressOf()); if (FAILED(hr)) break; - QComPtr<IMFSample> videoSample; - hr = MFCreateVideoSampleFromSurface(surface.get(), videoSample.address()); + ComPtr<IMFSample> videoSample; + hr = MFCreateVideoSampleFromSurface(surface.Get(), videoSample.GetAddressOf()); if (FAILED(hr)) break; - m_sampleTextureHandle[i] = {videoSample.get(), sharedHandle}; - videoSampleQueue.append(videoSample.release()); + m_sampleTextureHandle[i] = {videoSample.Get(), sharedHandle}; + videoSampleQueue.append(videoSample.Detach()); } if (SUCCEEDED(hr)) { |