Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qwindowsmediafoundation.cpp
Go to the documentation of this file.
1// Copyright (C) 2021 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
5
6#include <QtCore/qdebug.h>
7#include <QtCore/qmutex.h>
8#include <QtCore/private/qfunctions_win_p.h>
9
11
12namespace {
13
14Q_GLOBAL_STATIC(QWindowsMediaFoundation, s_wmf);
15
16template <typename T>
17bool setProcAddress(QSystemLibrary &lib, T &f, const char name[])
18{
19 f = reinterpret_cast<T>(lib.resolve(name));
20 return static_cast<bool>(f);
21}
22
23} // namespace
24
25QWindowsMediaFoundation *QWindowsMediaFoundation::instance()
26{
27 if (s_wmf->valid())
28 return s_wmf;
29
30 return nullptr;
31}
32
33QWindowsMediaFoundation::QWindowsMediaFoundation()
34{
35 if (!m_mfplat.load(false))
36 return;
37
38 if (!m_mf.load(false))
39 return;
40
41 if (!m_mfreadwrite.load(false))
42 return;
43
44 m_valid = setProcAddress(m_mfplat, mfStartup, "MFStartup")
45 && setProcAddress(m_mfplat, mfShutdown, "MFShutdown")
46 && setProcAddress(m_mfplat, mfCreateMediaType, "MFCreateMediaType")
47 && setProcAddress(m_mfplat, mfCreateMemoryBuffer, "MFCreateMemoryBuffer")
48 && setProcAddress(m_mfplat, mfCreateSample, "MFCreateSample")
49 && setProcAddress(m_mfplat, mfCreateAttributes, "MFCreateAttributes")
50 && setProcAddress(m_mf, mfEnumDeviceSources, "MFEnumDeviceSources")
51 && setProcAddress(m_mfreadwrite, mfCreateSourceReaderFromMediaSource,
52 "MFCreateSourceReaderFromMediaSource");
53
54 Q_ASSERT(m_valid); // If it is not valid at this point, we have a programming bug
55}
56
57QWindowsMediaFoundation::~QWindowsMediaFoundation() = default;
58
59bool QWindowsMediaFoundation::valid() const
60{
61 return m_valid;
62}
63
64QMFRuntimeInit::QMFRuntimeInit()
65 : QMFRuntimeInit{
66 QWindowsMediaFoundation::instance(),
67 }
68{
69}
70
71static HRESULT startupMediaFoundation(QWindowsMediaFoundation *wmf)
72{
73 qt_win_ensureComInitializedOnThisThread();
74 return wmf ? wmf->mfStartup(MF_VERSION, MFSTARTUP_FULL) : E_FAIL;
75}
76
77QMFRuntimeInit::QMFRuntimeInit(QWindowsMediaFoundation *wmf)
78 : m_wmf{ wmf }, m_initResult{ startupMediaFoundation(wmf) }
79{
80 if (m_initResult != S_OK)
81 qErrnoWarning(m_initResult, "Failed to initialize Windows Media Foundation");
82}
83
84QMFRuntimeInit::~QMFRuntimeInit()
85{
86 // According to documentation MFShutdown should be called
87 // also when MFStartup failed. This is wrong.
88 if (FAILED(m_initResult))
89 return;
90
91 const HRESULT hr = m_wmf->mfShutdown();
92 if (hr != S_OK)
93 qErrnoWarning(hr, "Failed to shut down Windows Media Foundation");
94}
95
96QT_END_NAMESPACE
Combined button and popup list for selecting options.
Q_GLOBAL_STATIC(QWindowsMediaFoundation, s_wmf)
bool setProcAddress(QSystemLibrary &lib, T &f, const char name[])
static HRESULT startupMediaFoundation(QWindowsMediaFoundation *wmf)