15#ifndef QWFM_SUPPORT_P_H
16#define QWFM_SUPPORT_P_H
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>
28#include <memory_resource>
39template <
typename Functor>
45 return q23::unexpected{ E_POINTER };
49 DWORD currentLength = 0;
51 HRESULT hr = buffer->Lock(&data, &maxLength, ¤tLength);
53 return q23::unexpected{ hr };
55 auto unlockGuard = qScopeGuard([buffer]() {
59 if constexpr (std::is_void_v<IMFBufferReaderReturnType<Functor>>) {
60 f(QSpan{ data, qsizetype(currentLength) }, QSpan{ data, qsizetype(maxLength) });
63 return f(QSpan{ data, qsizetype(currentLength) }, QSpan{ data, qsizetype(maxLength) });
66template <
typename Functor>
71 return withLockedBuffer(buffer.Get(),
std::forward<Functor>(f));
76class QByteArrayMFMediaBuffer
final :
public QComObject<IMFMediaBuffer>
80 bool isReadOnly =
false);
84 STDMETHODIMP Lock(BYTE **ppbBuffer, DWORD *pcbMaxLength, DWORD *pcbCurrentLength)
override;
94 explicit QByteArrayMFMediaBuffer(QByteArray &&data,
bool isReadOnly);
95 ~QByteArrayMFMediaBuffer() =
default;
97 DWORD GetMaxLengthInternal()
const;
100 std::atomic_flag m_isLocked = ATOMIC_FLAG_INIT;
101 DWORD m_currentLength{ 0 };
102 QByteArray m_byteArray;
103 const bool m_isReadOnly{};
107 QByteArrayMFMediaBuffer &
operator=(
const QByteArrayMFMediaBuffer &) =
delete;
109 QByteArrayMFMediaBuffer &
operator=(QByteArrayMFMediaBuffer &&) =
delete;
114class QPmrMediaBuffer
final :
public QComObject<IMFMediaBuffer>
118 IMFMediaBuffer **ppBuffer);
120 IMFMediaBuffer **ppBuffer);
127 STDMETHODIMP Lock(BYTE **ppbBuffer, DWORD *pcbMaxLength, DWORD *pcbCurrentLength)
override;
135 QPmrMediaBuffer(QSpan<
const std::byte>, std::pmr::memory_resource *);
136 QPmrMediaBuffer(qsizetype capacity,
std::pmr::memory_resource *);
140 std::atomic_flag m_isLocked = ATOMIC_FLAG_INIT;
141 std::pmr::memory_resource *m_memoryResource;
143 DWORD m_currentLength{ 0 };
145 std::byte *
const m_buffer;
148 Q_DISABLE_COPY_MOVE(QPmrMediaBuffer)
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