8#include <QtCore/qfile.h>
9#include <QtCore/qdebug.h>
10#include <QtMultimedia/qmediaplayer.h>
34 m_mediaSource->Release();
39 m_cancelCookie->Release();
41 m_sourceResolver->Release();
48 if (
riid == IID_IUnknown) {
49 *ppvObject =
static_cast<IUnknown*
>(
this);
50 }
else if (
riid == IID_IMFAsyncCallback) {
51 *ppvObject =
static_cast<IMFAsyncCallback*
>(
this);
62 return InterlockedIncrement(&m_cRef);
67 LONG cRef = InterlockedDecrement(&m_cRef);
77 if (!m_sourceResolver)
80 MF_OBJECT_TYPE ObjectType = MF_OBJECT_INVALID;
81 IUnknown* pSource = NULL;
82 State *
state =
static_cast<State*
>(pAsyncResult->GetStateNoAddRef());
85 if (
state->fromStream())
86 hr = m_sourceResolver->EndCreateObjectFromByteStream(pAsyncResult, &ObjectType, &pSource);
88 hr = m_sourceResolver->EndCreateObjectFromURL(pAsyncResult, &ObjectType, &pSource);
90 if (
state->sourceResolver() != m_sourceResolver) {
96 m_cancelCookie->Release();
97 m_cancelCookie = NULL;
106 m_mediaSource->Release();
107 m_mediaSource = NULL;
110 hr = pSource->QueryInterface(IID_PPV_ARGS(&m_mediaSource));
131 if (!m_sourceResolver)
132 hr = MFCreateSourceResolver(&m_sourceResolver);
140 qWarning() <<
"Failed to create Source Resolver!";
145 hr = m_sourceResolver->BeginCreateObjectFromByteStream(
146 m_stream, urlString.
isEmpty() ? 0 :
reinterpret_cast<LPCWSTR
>(urlString.
utf16()),
147 MF_RESOLUTION_MEDIASOURCE | MF_RESOLUTION_CONTENT_DOES_NOT_HAVE_TO_MATCH_EXTENSION_OR_MIME_TYPE
148 , NULL, &m_cancelCookie,
this,
new State(m_sourceResolver,
true));
150 qWarning() <<
"Unsupported stream!";
154#ifdef DEBUG_MEDIAFOUNDATION
164 hr = m_sourceResolver->BeginCreateObjectFromByteStream(
166 MF_RESOLUTION_MEDIASOURCE | MF_RESOLUTION_CONTENT_DOES_NOT_HAVE_TO_MATCH_EXTENSION_OR_MIME_TYPE,
167 NULL, &m_cancelCookie,
this,
new State(m_sourceResolver,
true));
169 qWarning() <<
"Unsupported stream!";
184 hr = m_sourceResolver->BeginCreateObjectFromByteStream(
186 MF_RESOLUTION_MEDIASOURCE | MF_RESOLUTION_CONTENT_DOES_NOT_HAVE_TO_MATCH_EXTENSION_OR_MIME_TYPE,
187 NULL, &m_cancelCookie,
this,
new State(m_sourceResolver,
true));
189 qWarning() <<
"Unsupported stream!";
197 hr = m_sourceResolver->BeginCreateObjectFromURL(
199 MF_RESOLUTION_MEDIASOURCE | MF_RESOLUTION_CONTENT_DOES_NOT_HAVE_TO_MATCH_EXTENSION_OR_MIME_TYPE,
200 NULL, &m_cancelCookie,
this,
new State(m_sourceResolver,
false));
202 qWarning() <<
"Unsupported url scheme!";
212 if (m_cancelCookie) {
213 m_sourceResolver->CancelObjectCreation(m_cancelCookie);
214 m_cancelCookie->Release();
215 m_cancelCookie = NULL;
216 m_sourceResolver->Release();
217 m_sourceResolver = NULL;
224 m_mediaSource->Shutdown();
225 m_mediaSource->Release();
226 m_mediaSource = NULL;
237 return m_mediaSource;
241SourceResolver::State::State(IMFSourceResolver *sourceResolver,
bool fromStream)
243 , m_sourceResolver(sourceResolver)
244 , m_fromStream(fromStream)
246 sourceResolver->AddRef();
249SourceResolver::State::~State()
251 m_sourceResolver->Release();
254STDMETHODIMP SourceResolver::State::QueryInterface(REFIID
riid, LPVOID *ppvObject)
258 if (
riid == IID_IUnknown) {
259 *ppvObject =
static_cast<IUnknown*
>(
this);
262 return E_NOINTERFACE;
270 return InterlockedIncrement(&m_cRef);
275 LONG cRef = InterlockedDecrement(&m_cRef);
282IMFSourceResolver* SourceResolver::State::sourceResolver()
const
284 return m_sourceResolver;
287bool SourceResolver::State::fromStream()
const
294#include "moc_sourceresolver_p.cpp"
\inmodule QtCore \reentrant
void deleteLater()
\threadsafe
\macro QT_RESTRICTED_CAST_FROM_ASCII
const ushort * utf16() const
Returns the QString as a '\0\'-terminated array of unsigned shorts.
QString mid(qsizetype position, qsizetype n=-1) const
Returns a string that contains n characters of this string, starting at the specified position index.
bool isEmpty() const
Returns true if the string has no characters; otherwise returns false.
QString scheme() const
Returns the scheme of the URL.
QString toString(FormattingOptions options=FormattingOptions(PrettyDecoded)) const
Returns a string representation of the URL.
QString path(ComponentFormattingOptions options=FullyDecoded) const
Returns the path of the URL.
HRESULT STDMETHODCALLTYPE GetParameters(DWORD *, DWORD *) override
HRESULT STDMETHODCALLTYPE Invoke(IMFAsyncResult *pAsyncResult) override
IMFMediaSource * mediaSource() const
STDMETHODIMP QueryInterface(REFIID riid, LPVOID *ppvObject) override
void load(const QUrl &url, QIODevice *stream)
Combined button and popup list for selecting options.
IUIViewSettingsInterop __RPC__in REFIID riid
STDMETHODIMP_(ULONG) SourceResolver
QUrl url("example.com")
[constructor-url-reference]
\inmodule QtCore \reentrant