31HRESULT STDMETHODCALLTYPE SourceResolver::Invoke(IMFAsyncResult *pAsyncResult)
33 std::lock_guard lock(m_mutex);
35 if (!m_sourceResolver)
38 MF_OBJECT_TYPE ObjectType = MF_OBJECT_INVALID;
39 ComPtr<IUnknown> pSource;
40 State *state =
static_cast<State*>(pAsyncResult->GetStateNoAddRef());
43 if (state->fromStream())
44 hr = m_sourceResolver->EndCreateObjectFromByteStream(pAsyncResult, &ObjectType, &pSource);
46 hr = m_sourceResolver->EndCreateObjectFromURL(pAsyncResult, &ObjectType, &pSource);
48 if (state->sourceResolver() != m_sourceResolver) {
53 m_cancelCookie =
nullptr;
60 hr = pSource.As(&m_mediaSource);
66 emit mediaSourceReady();
78 std::lock_guard lock(m_mutex);
80 if (!m_sourceResolver)
81 hr = MFCreateSourceResolver(&m_sourceResolver);
86 qWarning() <<
"Failed to create Source Resolver!";
89 QString urlString = url.toString();
90 m_stream = makeComObject<MFStream>(stream,
false);
91 hr = m_sourceResolver->BeginCreateObjectFromByteStream(
92 m_stream.Get(), urlString.isEmpty() ? 0 :
reinterpret_cast<LPCWSTR>(urlString.utf16()),
93 MF_RESOLUTION_MEDIASOURCE | MF_RESOLUTION_CONTENT_DOES_NOT_HAVE_TO_MATCH_EXTENSION_OR_MIME_TYPE
94 , NULL, &m_cancelCookie,
this, makeComObject<State>(m_sourceResolver,
true).Get());
96 qWarning() <<
"Unsupported stream!";
100#ifdef DEBUG_MEDIAFOUNDATION
101 qDebug() <<
"loading :" << url;
102 qDebug() <<
"url path =" << url.path().mid(1);
106 if (url.scheme() == u"file") {
107 stream =
new QFile(url.path().mid(1));
108 if (stream->open(QIODevice::ReadOnly)) {
109 m_stream = makeComObject<MFStream>(stream,
true);
110 hr = m_sourceResolver->BeginCreateObjectFromByteStream(
111 m_stream.Get(),
reinterpret_cast<
const OLECHAR *>(url.toString().utf16()),
112 MF_RESOLUTION_MEDIASOURCE | MF_RESOLUTION_CONTENT_DOES_NOT_HAVE_TO_MATCH_EXTENSION_OR_MIME_TYPE,
113 NULL, &m_cancelCookie,
this, makeComObject<State>(m_sourceResolver,
true).Get());
115 qWarning() <<
"Unsupported stream!";
120 emit error(QMediaPlayer::FormatError);
124 if (url.scheme() == u"qrc") {
127 stream =
new QFile(QLatin1Char(
':') + url.path());
128 if (stream->open(QIODevice::ReadOnly)) {
129 m_stream = makeComObject<MFStream>(stream,
true);
130 hr = m_sourceResolver->BeginCreateObjectFromByteStream(
131 m_stream.Get(),
reinterpret_cast<
const OLECHAR *>(url.toString().utf16()),
132 MF_RESOLUTION_MEDIASOURCE | MF_RESOLUTION_CONTENT_DOES_NOT_HAVE_TO_MATCH_EXTENSION_OR_MIME_TYPE,
133 NULL, &m_cancelCookie,
this, makeComObject<State>(m_sourceResolver,
true).Get());
135 qWarning() <<
"Unsupported stream!";
140 emit error(QMediaPlayer::FormatError);
143 hr = m_sourceResolver->BeginCreateObjectFromURL(
144 reinterpret_cast<
const OLECHAR *>(url.toString().utf16()),
145 MF_RESOLUTION_MEDIASOURCE | MF_RESOLUTION_CONTENT_DOES_NOT_HAVE_TO_MATCH_EXTENSION_OR_MIME_TYPE,
146 NULL, &m_cancelCookie,
this, makeComObject<State>(m_sourceResolver,
false).Get());
148 qWarning() <<
"Unsupported url scheme!";