void tst_QMediaResource::constructNull() { QMediaResource resource; QCOMPARE(resource.isNull(), true); QCOMPARE(resource.url(), QUrl()); QCOMPARE(resource.request(), QNetworkRequest()); QCOMPARE(resource.mimeType(), QString()); QCOMPARE(resource.language(), QString()); QCOMPARE(resource.audioCodec(), QString()); QCOMPARE(resource.videoCodec(), QString()); QCOMPARE(resource.dataSize(), qint64(0)); QCOMPARE(resource.audioBitRate(), 0); QCOMPARE(resource.sampleRate(), 0); QCOMPARE(resource.channelCount(), 0); QCOMPARE(resource.videoBitRate(), 0); QCOMPARE(resource.resolution(), QSize()); }
void DirectShowPlayerService::doSetUrlSource(QMutexLocker *locker) { IBaseFilter *source = 0; QMediaResource resource = m_resources.takeFirst(); QUrl url = resource.url(); HRESULT hr = E_FAIL; if (url.scheme() == QLatin1String("http") || url.scheme() == QLatin1String("https")) { static const GUID clsid_WMAsfReader = { 0x187463a0, 0x5bb7, 0x11d3, {0xac, 0xbe, 0x00, 0x80, 0xc7, 0x5e, 0x24, 0x6e} }; // {56a868a6-0ad4-11ce-b03a-0020af0ba770} static const GUID iid_IFileSourceFilter = { 0x56a868a6, 0x0ad4, 0x11ce, {0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70} }; if (IFileSourceFilter *fileSource = com_new<IFileSourceFilter>( clsid_WMAsfReader, iid_IFileSourceFilter)) { locker->unlock(); hr = fileSource->Load(reinterpret_cast<const OLECHAR *>(url.toString().utf16()), 0); if (SUCCEEDED(hr)) { source = com_cast<IBaseFilter>(fileSource, IID_IBaseFilter); if (!SUCCEEDED(hr = m_graph->AddFilter(source, L"Source")) && source) { source->Release(); source = 0; } } fileSource->Release(); locker->relock(); } } else if (url.scheme() == QLatin1String("qrc")) { DirectShowRcSource *rcSource = new DirectShowRcSource(m_loop); locker->unlock(); if (rcSource->open(url) && SUCCEEDED(hr = m_graph->AddFilter(rcSource, L"Source"))) source = rcSource; else rcSource->Release(); locker->relock(); } if (!SUCCEEDED(hr)) { locker->unlock(); hr = m_graph->AddSourceFilter( reinterpret_cast<const OLECHAR *>(url.toString().utf16()), L"Source", &source); locker->relock(); } if (SUCCEEDED(hr)) { m_executedTasks = SetSource; m_pendingTasks |= Render; if (m_audioOutput) m_pendingTasks |= SetAudioOutput; if (m_videoOutput) m_pendingTasks |= SetVideoOutput; if (m_rate != 1.0) m_pendingTasks |= SetRate; m_source = source; } else if (!m_resources.isEmpty()) { m_pendingTasks |= SetUrlSource; } else { m_pendingTasks = 0; m_graphStatus = InvalidMedia; switch (hr) { case VFW_E_UNKNOWN_FILE_TYPE: m_error = QMediaPlayer::FormatError; m_errorString = QString(); break; case E_OUTOFMEMORY: case VFW_E_CANNOT_LOAD_SOURCE_FILTER: case VFW_E_NOT_FOUND: m_error = QMediaPlayer::ResourceError; m_errorString = QString(); break; default: m_error = QMediaPlayer::ResourceError; m_errorString = QString(); qWarning("DirectShowPlayerService::doSetUrlSource: Unresolved error code %x", uint(hr)); break; } QCoreApplication::postEvent(this, new QEvent(QEvent::Type(Error))); } }
void SourceResolver::load(QMediaResourceList& resources, QIODevice* stream) { QMutexLocker locker(&m_mutex); HRESULT hr = S_OK; if (!m_sourceResolver) hr = MFCreateSourceResolver(&m_sourceResolver); if (m_stream) { m_stream->Release(); m_stream = NULL; } if (FAILED(hr)) { qWarning() << "Failed to create Source Resolver!"; emit error(hr); } else if (stream) { if (resources.count() > 0) { QMediaResource resource = resources.takeFirst(); QUrl url = resource.url(); m_stream = new MFStream(stream, false); hr = m_sourceResolver->BeginCreateObjectFromByteStream(m_stream, reinterpret_cast<const OLECHAR *>(url.toString().utf16()), MF_RESOLUTION_MEDIASOURCE, NULL, &m_cancelCookie, this, new State(m_sourceResolver, true)); if (FAILED(hr)) { qWarning() << "Unsupported stream!"; emit error(hr); } } else { hr = MF_E_UNSUPPORTED_BYTESTREAM_TYPE; qWarning() << "Can't load stream without a hint of MIME type in a url"; emit error(hr); } } else { QMediaResource resource = resources.takeFirst(); QUrl url = resource.url(); #ifdef DEBUG_MEDIAFOUNDATION qDebug() << "loading :" << url; qDebug() << "url path =" << url.path().mid(1); #endif #ifdef TEST_STREAMING //Testing stream function if (url.scheme() == QLatin1String("file")) { stream = new QFile(url.path().mid(1), this); if (stream->open(QIODevice::ReadOnly)) { m_stream = new MFStream(stream, true); hr = m_sourceResolver->BeginCreateObjectFromByteStream(m_stream, reinterpret_cast<const OLECHAR *>(url.toString().utf16()), MF_RESOLUTION_MEDIASOURCE, NULL, &m_cancelCookie, this, new State(m_sourceResolver, true)); if (FAILED(hr)) { qWarning() << "Unsupported stream!"; emit error(hr); } } else { delete stream; emit error(QMediaPlayer::FormatError); } } else #endif if (url.scheme() == QLatin1String("qrc")) { // If the canonical URL refers to a Qt resource, open with QFile and use // the stream playback capability to play. stream = new QFile(QLatin1Char(':') + url.path(), this); if (stream->open(QIODevice::ReadOnly)) { m_stream = new MFStream(stream, true); hr = m_sourceResolver->BeginCreateObjectFromByteStream(m_stream, reinterpret_cast<const OLECHAR *>(url.toString().utf16()), MF_RESOLUTION_MEDIASOURCE, NULL, &m_cancelCookie, this, new State(m_sourceResolver, true)); if (FAILED(hr)) { qWarning() << "Unsupported stream!"; emit error(hr); } } else { delete stream; emit error(QMediaPlayer::FormatError); } } else { hr = m_sourceResolver->BeginCreateObjectFromURL(reinterpret_cast<const OLECHAR *>(url.toString().utf16()), MF_RESOLUTION_MEDIASOURCE, NULL, &m_cancelCookie, this, new State(m_sourceResolver, false)); if (FAILED(hr)) { qWarning() << "Unsupported url scheme!"; emit error(hr); } } } }