6#include <QtCore/qcoreapplication.h>
13 :
m_stream(
stream), m_ownStream(ownStream), m_synchronous(synchronous)
19 this->moveToThread(stream->thread());
25 m_stream->deleteLater();
29STDMETHODIMP MFStream::GetCapabilities(DWORD *pdwCapabilities)
33 *pdwCapabilities = MFBYTESTREAM_IS_READABLE;
34 if (!m_stream->isSequential())
35 *pdwCapabilities |= MFBYTESTREAM_IS_SEEKABLE;
39STDMETHODIMP MFStream::GetLength(QWORD *pqwLength)
43 QMutexLocker locker(&m_mutex);
44 *pqwLength = QWORD(m_stream->size());
48STDMETHODIMP MFStream::SetLength(QWORD)
53STDMETHODIMP MFStream::GetCurrentPosition(QWORD *pqwPosition)
57 QMutexLocker locker(&m_mutex);
58 *pqwPosition = m_stream->pos();
62STDMETHODIMP MFStream::SetCurrentPosition(QWORD qwPosition)
64 QMutexLocker locker(&m_mutex);
68 if (m_currentReadResult)
71 bool seekOK = m_stream->seek(qint64(qwPosition));
78STDMETHODIMP MFStream::IsEndOfStream(BOOL *pfEndOfStream)
82 QMutexLocker locker(&m_mutex);
83 *pfEndOfStream = m_stream->atEnd() ? TRUE : FALSE;
87STDMETHODIMP MFStream::Read(BYTE *pb, ULONG cb, ULONG *pcbRead)
89 QMutexLocker locker(&m_mutex);
90 qint64 read = m_stream->read((
char*)(pb), qint64(cb));
92 *pcbRead = ULONG(read);
96STDMETHODIMP MFStream::BeginRead(BYTE *pb, ULONG cb, IMFAsyncCallback *pCallback,
99 if (!pCallback || !pb)
105 Read(pb, cb, &cbRead);
107 ComPtr<IMFAsyncResult> result;
108 HRESULT hr = MFCreateAsyncResult(
nullptr, pCallback, punkState, &result);
112 m_syncReadCount = cbRead;
113 result->SetStatus(S_OK);
114 hr = MFInvokeCallback(result.Get());
118 Q_ASSERT(m_currentReadResult ==
nullptr);
120 ComPtr<AsyncReadState> state = makeComObject<AsyncReadState>(pb, cb);
122 HRESULT hr = MFCreateAsyncResult(state.Get(), pCallback, punkState, &m_currentReadResult);
126 QCoreApplication::postEvent(
this,
new QEvent(QEvent::User));
130STDMETHODIMP MFStream::EndRead(IMFAsyncResult* pResult, ULONG *pcbRead)
136 *pcbRead = m_syncReadCount;
140 ComPtr<IUnknown> pUnk;
141 pResult->GetObject(&pUnk);
142 auto *state =
static_cast<AsyncReadState *>(pUnk.Get());
143 *pcbRead = state->bytesRead();
145 m_currentReadResult =
nullptr;
150STDMETHODIMP MFStream::Write(
const BYTE *, ULONG, ULONG *)
155STDMETHODIMP MFStream::BeginWrite(
const BYTE *, ULONG ,
162STDMETHODIMP MFStream::EndWrite(IMFAsyncResult *,
168STDMETHODIMP MFStream::Seek(
169 MFBYTESTREAM_SEEK_ORIGIN SeekOrigin,
170 LONGLONG llSeekOffset,
172 QWORD *pqwCurrentPosition)
174 QMutexLocker locker(&m_mutex);
175 if (m_currentReadResult)
178 qint64 pos = qint64(llSeekOffset);
179 switch (SeekOrigin) {
183 pos += m_stream->pos();
186 bool seekOK = m_stream->seek(pos);
187 if (pqwCurrentPosition)
188 *pqwCurrentPosition = pos;
195STDMETHODIMP MFStream::Flush()
200STDMETHODIMP MFStream::Close()
202 QMutexLocker locker(&m_mutex);
208void MFStream::doRead()
213 bool readDone =
true;
214 ComPtr<IUnknown> pUnk;
215 HRESULT hr = m_currentReadResult->GetObject(&pUnk);
218 auto *state =
static_cast<AsyncReadState *>(pUnk.Get());
220 Read(state->pb(), state->cb() - state->bytesRead(), &cbRead);
222 state->setBytesRead(cbRead + state->bytesRead());
223 if (state->cb() > state->bytesRead() && !m_stream->atEnd()) {
230 m_currentReadResult->SetStatus(hr);
231 MFInvokeCallback(m_currentReadResult.Get());
235void MFStream::customEvent(QEvent *event)
237 if (event->type() != QEvent::User) {
238 QObject::customEvent(event);
247MFStream::AsyncReadState::AsyncReadState(BYTE *pb, ULONG cb)
255BYTE* MFStream::AsyncReadState::pb()
const
260ULONG MFStream::AsyncReadState::cb()
const
265ULONG MFStream::AsyncReadState::bytesRead()
const
270void MFStream::AsyncReadState::setBytesRead(ULONG cbRead)
277#include "moc_mfstream_p.cpp"
\inmodule QtCore \reentrant
Combined button and popup list for selecting options.