Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Toggle main menu visibility
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
4
#
include
"qwindowsmediafoundation_p.h"
5
6
#
include
<
QtCore
/
qdebug
.
h
>
7
#
include
<
QtCore
/
qmutex
.
h
>
8
#
include
<
QtCore
/
private
/
qfunctions_win_p
.
h
>
9
10
QT_BEGIN_NAMESPACE
11
12
namespace
{
13
14
Q_GLOBAL_STATIC
(QWindowsMediaFoundation,
s_wmf
);
15
16
template
<
typename
T>
17
bool
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
25
QWindowsMediaFoundation *QWindowsMediaFoundation::instance()
26
{
27
if
(s_wmf->valid())
28
return
s_wmf;
29
30
return
nullptr
;
31
}
32
33
QWindowsMediaFoundation::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
57
QWindowsMediaFoundation::~QWindowsMediaFoundation() =
default
;
58
59
bool
QWindowsMediaFoundation::valid()
const
60
{
61
return
m_valid;
62
}
63
64
QMFRuntimeInit::QMFRuntimeInit()
65
: QMFRuntimeInit{
66
QWindowsMediaFoundation::instance(),
67
}
68
{
69
}
70
71
static
HRESULT
startupMediaFoundation
(QWindowsMediaFoundation *wmf)
72
{
73
qt_win_ensureComInitializedOnThisThread();
74
return
wmf ? wmf->mfStartup(MF_VERSION, MFSTARTUP_FULL) : E_FAIL;
75
}
76
77
QMFRuntimeInit::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
84
QMFRuntimeInit::~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
96
QT_END_NAMESPACE
QT_BEGIN_NAMESPACE
Combined button and popup list for selecting options.
Definition
qsequentialanimationgroup.cpp:47
QT_BEGIN_NAMESPACE::Q_GLOBAL_STATIC
Q_GLOBAL_STATIC(QWindowsMediaFoundation, s_wmf)
QT_BEGIN_NAMESPACE::setProcAddress
bool setProcAddress(QSystemLibrary &lib, T &f, const char name[])
Definition
qwindowsmediafoundation.cpp:17
startupMediaFoundation
static HRESULT startupMediaFoundation(QWindowsMediaFoundation *wmf)
Definition
qwindowsmediafoundation.cpp:71
qtmultimedia
src
multimedia
windows
qwindowsmediafoundation.cpp
Generated on
for Qt by
1.18.0