23HRESULT QByteArrayMFMediaBuffer::CreateInstance(QByteArray data, IMFMediaBuffer **ppBuffer,
29 DWORD size = data.size();
31 QByteArrayMFMediaBuffer *pBuffer =
32 new (
std::nothrow) QByteArrayMFMediaBuffer(
std::move(data), isReadOnly);
36 pBuffer->SetCurrentLength(size);
39 pBuffer->QueryInterface(__uuidof(IMFMediaBuffer),
reinterpret_cast<
void **>(ppBuffer));
45HRESULT QByteArrayMFMediaBuffer::CreateInstance(qsizetype capacity, IMFMediaBuffer **ppBuffer)
50 QByteArray buffer{ capacity, Qt::Initialization::Uninitialized };
51 QByteArrayMFMediaBuffer *pBuffer =
52 new (
std::nothrow) QByteArrayMFMediaBuffer(
std::move(buffer),
false);
57 pBuffer->QueryInterface(__uuidof(IMFMediaBuffer),
reinterpret_cast<
void **>(ppBuffer));
63HRESULT QByteArrayMFMediaBuffer::
Lock(BYTE **ppbBuffer, DWORD *pcbMaxLength,
64 DWORD *pcbCurrentLength)
69 if (m_isLocked.test_and_set(std::memory_order_acquire))
70 return MF_E_INVALIDREQUEST;
74 *ppbBuffer =
const_cast<BYTE *>(
reinterpret_cast<
const BYTE *>(m_byteArray.constData()));
76 *ppbBuffer =
reinterpret_cast<BYTE *>(m_byteArray.data());
79 *pcbMaxLength = GetMaxLengthInternal();
82 *pcbCurrentLength = m_currentLength;
89 m_isLocked.clear(std::memory_order_release);
95 if (!pcbCurrentLength)
98 *pcbCurrentLength = m_currentLength;
104 if (cbCurrentLength > GetMaxLengthInternal())
107 m_currentLength = cbCurrentLength;
116 *pcbMaxLength = GetMaxLengthInternal();
120QByteArrayMFMediaBuffer::QByteArrayMFMediaBuffer(QByteArray &&data,
bool isReadOnly)
121 : m_byteArray(std::move(data)), m_isReadOnly(isReadOnly)
125DWORD QByteArrayMFMediaBuffer::GetMaxLengthInternal()
const
127 return static_cast<DWORD>(m_byteArray.size());
132 return std::move(m_byteArray);
160HRESULT QPmrMediaBuffer::CreateInstance(qsizetype capacity,
std::pmr::memory_resource *resource,
161 IMFMediaBuffer **ppBuffer)
163 if (!ppBuffer || !resource)
167 void *buffer = resource->allocate(
sizeof(QPmrMediaBuffer),
alignof(QPmrMediaBuffer));
168 QPmrMediaBuffer *pBuffer =
new (buffer) QPmrMediaBuffer(capacity, resource);
170 return E_OUTOFMEMORY;
173 pBuffer->QueryInterface(__uuidof(IMFMediaBuffer),
reinterpret_cast<
void **>(ppBuffer));
178ULONG QPmrMediaBuffer::Release()
180 const LONG referenceCount = m_referenceCount.fetch_sub(1, std::memory_order_release) - 1;
181 if (referenceCount == 0) {
185 std::atomic_thread_fence(
std::memory_order_acquire);
187 std::pmr::memory_resource *resource = m_memoryResource;
189 this->~QPmrMediaBuffer();
190 resource->deallocate(
this,
sizeof(QPmrMediaBuffer),
alignof(QPmrMediaBuffer));
193 return referenceCount;
196STDMETHODIMP QPmrMediaBuffer::
Lock(BYTE **ppbBuffer, DWORD *pcbMaxLength, DWORD *pcbCurrentLength)
201 if (m_isLocked.test_and_set(std::memory_order_acquire))
202 return MF_E_INVALIDREQUEST;
204 *ppbBuffer =
reinterpret_cast<BYTE *>(m_buffer);
207 *pcbMaxLength = m_maxLength;
209 if (pcbCurrentLength)
210 *pcbCurrentLength = m_currentLength;
217 m_isLocked.clear(std::memory_order_release);
223 if (!pcbCurrentLength)
226 *pcbCurrentLength = m_currentLength;
232 if (cbCurrentLength > m_maxLength)
235 m_currentLength = cbCurrentLength;
244 *pcbMaxLength = m_maxLength;
250QPmrMediaBuffer::QPmrMediaBuffer(QSpan<
const std::byte> data,
std::pmr::memory_resource *resource)
251 : QPmrMediaBuffer(data.size(), resource)
253 m_currentLength = data.size(), std::copy(data.begin(), data.end(), m_buffer);
256QPmrMediaBuffer::QPmrMediaBuffer(qsizetype capacity,
std::pmr::memory_resource *resource)
257 : m_memoryResource(resource),
258 m_maxLength(DWORD(capacity)),
263QPmrMediaBuffer::~QPmrMediaBuffer()
265 m_memoryResource->deallocate(m_buffer, m_maxLength, mfBufferAlignment);