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>
29#include <memory_resource>
40template <
typename Functor>
46 return q23::unexpected{ E_POINTER };
50 DWORD currentLength = 0;
52 HRESULT hr = buffer->Lock(&data, &maxLength, ¤tLength);
54 return q23::unexpected{ hr };
56 auto unlockGuard = qScopeGuard([buffer]() {
60 if constexpr (std::is_void_v<IMFBufferReaderReturnType<Functor>>) {
61 f(QSpan{ data, qsizetype(currentLength) }, QSpan{ data, qsizetype(maxLength) });
64 return f(QSpan{ data, qsizetype(currentLength) }, QSpan{ data, qsizetype(maxLength) });
67template <
typename Functor>
72 return withLockedBuffer(buffer.Get(),
std::forward<Functor>(f));
77class QByteArrayMFMediaBuffer
final :
public QComObject<IMFMediaBuffer>
81 bool isReadOnly =
false);
85 STDMETHODIMP Lock(BYTE **ppbBuffer, DWORD *pcbMaxLength, DWORD *pcbCurrentLength)
override;
95 explicit QByteArrayMFMediaBuffer(QByteArray &&data,
bool isReadOnly);
96 ~QByteArrayMFMediaBuffer() =
default;
98 DWORD GetMaxLengthInternal()
const;
101 std::atomic_flag m_isLocked = ATOMIC_FLAG_INIT;
102 DWORD m_currentLength{ 0 };
103 QByteArray m_byteArray;
104 const bool m_isReadOnly{};
108 QByteArrayMFMediaBuffer &
operator=(
const QByteArrayMFMediaBuffer &) =
delete;
110 QByteArrayMFMediaBuffer &
operator=(QByteArrayMFMediaBuffer &&) =
delete;
115class QPmrMediaBuffer
final :
public QComObject<IMFMediaBuffer>
119 IMFMediaBuffer **ppBuffer);
121 IMFMediaBuffer **ppBuffer);
128 STDMETHODIMP Lock(BYTE **ppbBuffer, DWORD *pcbMaxLength, DWORD *pcbCurrentLength)
override;
136 QPmrMediaBuffer(QSpan<
const std::byte>, std::pmr::memory_resource *);
137 QPmrMediaBuffer(qsizetype capacity,
std::pmr::memory_resource *);
141 std::atomic_flag m_isLocked = ATOMIC_FLAG_INIT;
142 std::pmr::memory_resource *m_memoryResource;
144 DWORD m_currentLength{ 0 };
146 std::byte *
const m_buffer;
149 Q_DISABLE_COPY_MOVE(QPmrMediaBuffer)
156static_assert(reference_time(1) == std::chrono::nanoseconds(100));
Combined button and popup list for selecting options.
auto withLockedBuffer(const ComPtr< IMFMediaBuffer > &buffer, Functor &&f) -> q23::expected< IMFBufferReaderReturnType< Functor >, HRESULT >
std::chrono::duration< long long, std::ratio< 1, 10000000 > > reference_time
auto withLockedBuffer(IMFMediaBuffer *buffer, Functor &&f) -> q23::expected< IMFBufferReaderReturnType< Functor >, HRESULT >
static constexpr auto mfBufferAlignment