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
qwmf_support_p.h
Go to the documentation of this file.
1// Copyright (C) 2025 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//
5// W A R N I N G
6// -------------
7//
8// This file is not part of the Qt API. It exists for the convenience
9// of other Qt classes. This header file may change from version to
10// version without notice, or even be removed.
11//
12// We mean it.
13//
14
15#ifndef QWFM_SUPPORT_P_H
16#define QWFM_SUPPORT_P_H
17
18#include <QtMultimedia/qtmultimediaexports.h>
19#include <QtCore/qtconfigmacros.h>
20#include <QtCore/qspan.h>
21#include <QtCore/qbytearray.h>
22#include <QtCore/private/qexpected_p.h>
23#include <QtCore/private/qcomobject_p.h>
24#include <QtCore/private/qcomptr_p.h>
25
26#include <mfobjects.h>
27
28#include <memory_resource>
29
30QT_BEGIN_NAMESPACE
31
32namespace QWMF {
33
34///////////////////////////////////////////////////////////////////////////////////////////////////
35
36template <typename Functor>
38
39template <typename Functor>
40[[nodiscard]]
41auto withLockedBuffer(IMFMediaBuffer *buffer, Functor &&f)
43{
44 if (!buffer)
45 return q23::unexpected{ E_POINTER };
46
47 BYTE *data = nullptr;
48 DWORD maxLength = 0;
49 DWORD currentLength = 0;
50
51 HRESULT hr = buffer->Lock(&data, &maxLength, &currentLength);
52 if (FAILED(hr))
53 return q23::unexpected{ hr };
54
55 auto unlockGuard = qScopeGuard([buffer]() {
56 buffer->Unlock();
57 });
58
59 if constexpr (std::is_void_v<IMFBufferReaderReturnType<Functor>>) {
60 f(QSpan{ data, qsizetype(currentLength) }, QSpan{ data, qsizetype(maxLength) });
61 return {};
62 } else
63 return f(QSpan{ data, qsizetype(currentLength) }, QSpan{ data, qsizetype(maxLength) });
64}
65
66template <typename Functor>
67[[nodiscard]]
68auto withLockedBuffer(const ComPtr<IMFMediaBuffer> &buffer, Functor &&f)
70{
71 return withLockedBuffer(buffer.Get(), std::forward<Functor>(f));
72}
73
74///////////////////////////////////////////////////////////////////////////////////////////////////
75
76class QByteArrayMFMediaBuffer final : public QComObject<IMFMediaBuffer>
77{
78public:
79 static HRESULT CreateInstance(QByteArray data, IMFMediaBuffer **ppBuffer,
80 bool isReadOnly = false);
81 static HRESULT CreateInstance(qsizetype capacity, IMFMediaBuffer **ppBuffer);
82
83 // --- IMFMediaBuffer Methods ---
84 STDMETHODIMP Lock(BYTE **ppbBuffer, DWORD *pcbMaxLength, DWORD *pcbCurrentLength) override;
85 STDMETHODIMP Unlock() override;
86 STDMETHODIMP GetCurrentLength(DWORD *pcbCurrentLength) override;
87 STDMETHODIMP SetCurrentLength(DWORD cbCurrentLength) override;
88 STDMETHODIMP GetMaxLength(DWORD *pcbMaxLength) override;
89
91
92private:
93 // Protected constructor to enforce creation via CreateInstance factory method.
94 explicit QByteArrayMFMediaBuffer(QByteArray &&data, bool isReadOnly);
95 ~QByteArrayMFMediaBuffer() = default;
96
97 DWORD GetMaxLengthInternal() const;
98
99 // Member variables
100 std::atomic_flag m_isLocked = ATOMIC_FLAG_INIT;
101 DWORD m_currentLength{ 0 };
102 QByteArray m_byteArray;
103 const bool m_isReadOnly{};
104
105public:
106 QByteArrayMFMediaBuffer(const QByteArrayMFMediaBuffer &) = delete;
107 QByteArrayMFMediaBuffer &operator=(const QByteArrayMFMediaBuffer &) = delete;
108 QByteArrayMFMediaBuffer(QByteArrayMFMediaBuffer &&) = delete;
109 QByteArrayMFMediaBuffer &operator=(QByteArrayMFMediaBuffer &&) = delete;
110};
111
112///////////////////////////////////////////////////////////////////////////////////////////////////
113
114class QPmrMediaBuffer final : public QComObject<IMFMediaBuffer>
115{
116public:
117 static HRESULT CreateInstance(QSpan<const std::byte>, std::pmr::memory_resource *,
118 IMFMediaBuffer **ppBuffer);
119 static HRESULT CreateInstance(qsizetype capacity, std::pmr::memory_resource *,
120 IMFMediaBuffer **ppBuffer);
121
122 // --- IUnknown Methods ---
123 // we override QComObject::Release to free via the memory_resource
124 STDMETHODIMP_(ULONG) Release() override;
125
126 // --- IMFMediaBuffer Methods ---
127 STDMETHODIMP Lock(BYTE **ppbBuffer, DWORD *pcbMaxLength, DWORD *pcbCurrentLength) override;
128 STDMETHODIMP Unlock() override;
129 STDMETHODIMP GetCurrentLength(DWORD *pcbCurrentLength) override;
130 STDMETHODIMP SetCurrentLength(DWORD cbCurrentLength) override;
131 STDMETHODIMP GetMaxLength(DWORD *pcbMaxLength) override;
132
133private:
134 // Protected constructor to enforce creation via CreateInstance factory method.
135 QPmrMediaBuffer(QSpan<const std::byte>, std::pmr::memory_resource *);
136 QPmrMediaBuffer(qsizetype capacity, std::pmr::memory_resource *);
137 ~QPmrMediaBuffer();
138
139 // Member variables
140 std::atomic_flag m_isLocked = ATOMIC_FLAG_INIT;
141 std::pmr::memory_resource *m_memoryResource;
142
143 DWORD m_currentLength{ 0 };
144 DWORD m_maxLength;
145 std::byte *const m_buffer;
146
147public:
148 Q_DISABLE_COPY_MOVE(QPmrMediaBuffer)
149};
150
151///////////////////////////////////////////////////////////////////////////////////////////////////
152
153} // namespace QWMF
154
155QT_END_NAMESPACE
156
157#endif // QWFM_SUPPORT_P_H
STDMETHODIMP GetCurrentLength(DWORD *pcbCurrentLength) override
QByteArrayMFMediaBuffer & operator=(const QByteArrayMFMediaBuffer &)=delete
STDMETHODIMP Lock(BYTE **ppbBuffer, DWORD *pcbMaxLength, DWORD *pcbCurrentLength) override
static HRESULT CreateInstance(QByteArray data, IMFMediaBuffer **ppBuffer, bool isReadOnly=false)
STDMETHODIMP SetCurrentLength(DWORD cbCurrentLength) override
QByteArrayMFMediaBuffer(QByteArrayMFMediaBuffer &&)=delete
QByteArrayMFMediaBuffer(const QByteArrayMFMediaBuffer &)=delete
static HRESULT CreateInstance(qsizetype capacity, IMFMediaBuffer **ppBuffer)
QByteArrayMFMediaBuffer & operator=(QByteArrayMFMediaBuffer &&)=delete
STDMETHODIMP Unlock() override
STDMETHODIMP GetMaxLength(DWORD *pcbMaxLength) override
STDMETHODIMP Lock(BYTE **ppbBuffer, DWORD *pcbMaxLength, DWORD *pcbCurrentLength) override
STDMETHODIMP SetCurrentLength(DWORD cbCurrentLength) override
STDMETHODIMP GetCurrentLength(DWORD *pcbCurrentLength) override
STDMETHODIMP_(ULONG) Release() override
static HRESULT CreateInstance(QSpan< const std::byte >, std::pmr::memory_resource *, IMFMediaBuffer **ppBuffer)
STDMETHODIMP GetMaxLength(DWORD *pcbMaxLength) override
STDMETHODIMP Unlock() override
auto withLockedBuffer(const ComPtr< IMFMediaBuffer > &buffer, Functor &&f) -> q23::expected< IMFBufferReaderReturnType< Functor >, HRESULT >
auto withLockedBuffer(IMFMediaBuffer *buffer, Functor &&f) -> q23::expected< IMFBufferReaderReturnType< Functor >, HRESULT >
static constexpr auto mfBufferAlignment