diff options
author | Frederik Gladhorn <frederik.gladhorn@digia.com> | 2013-10-24 12:56:16 +0200 |
---|---|---|
committer | Frederik Gladhorn <frederik.gladhorn@digia.com> | 2013-10-24 12:56:17 +0200 |
commit | f15105a02dc1c6b2b95b8ab0dafd36098840fb0e (patch) | |
tree | 43496eee1f7b0621fe8cabcd295b68d0aade28d0 /src | |
parent | 1b563aca1a98760c9dded9e8a3d4eb726abb0ae2 (diff) | |
parent | d7dd22b9955ffde6d3c663655d9f9d4a58ca3894 (diff) |
Merge remote-tracking branch 'origin/stable' into dev
Change-Id: I15d0b9f03136840aff189ffb9de6e3899c204ca2
Diffstat (limited to 'src')
-rw-r--r-- | src/imports/multimedia/qdeclarativeaudio.cpp | 15 | ||||
-rw-r--r-- | src/imports/multimedia/qdeclarativeaudio_p.h | 1 | ||||
-rw-r--r-- | src/plugins/android/src/mediacapture/qandroidcamerasession.cpp | 1 | ||||
-rw-r--r-- | src/plugins/wmf/decoder/mfaudiodecodercontrol.cpp | 7 | ||||
-rw-r--r-- | src/plugins/wmf/mftvideo.cpp | 57 | ||||
-rw-r--r-- | src/plugins/wmf/player/mfplayersession.cpp | 21 | ||||
-rw-r--r-- | src/plugins/wmf/sourceresolver.cpp | 41 |
7 files changed, 107 insertions, 36 deletions
diff --git a/src/imports/multimedia/qdeclarativeaudio.cpp b/src/imports/multimedia/qdeclarativeaudio.cpp index 1da92c308..bce0b7e2a 100644 --- a/src/imports/multimedia/qdeclarativeaudio.cpp +++ b/src/imports/multimedia/qdeclarativeaudio.cpp @@ -183,8 +183,9 @@ void QDeclarativeAudio::setSource(const QUrl &url) return; m_source = url; + m_content = m_source.isEmpty() ? QMediaContent() : m_source; m_loaded = false; - if (m_complete && (m_autoLoad || url.isEmpty() || m_autoPlay)) { + if (m_complete && (m_autoLoad || m_content.isNull() || m_autoPlay)) { if (m_error != QMediaPlayer::ServiceMissingError && m_error != QMediaPlayer::NoError) { m_error = QMediaPlayer::NoError; m_errorString = QString(); @@ -192,7 +193,7 @@ void QDeclarativeAudio::setSource(const QUrl &url) emit errorChanged(); } - m_player->setMedia(m_source, 0); + m_player->setMedia(m_content, 0); m_loaded = true; } else @@ -245,7 +246,7 @@ void QDeclarativeAudio::setPlaybackState(QMediaPlayer::State playbackState) switch (playbackState){ case (QMediaPlayer::PlayingState): if (!m_loaded) { - m_player->setMedia(m_source, 0); + m_player->setMedia(m_content, 0); m_player->setPosition(m_position); m_loaded = true; } @@ -254,7 +255,7 @@ void QDeclarativeAudio::setPlaybackState(QMediaPlayer::State playbackState) case (QMediaPlayer::PausedState): if (!m_loaded) { - m_player->setMedia(m_source, 0); + m_player->setMedia(m_content, 0); m_player->setPosition(m_position); m_loaded = true; } @@ -681,8 +682,8 @@ void QDeclarativeAudio::componentComplete() if (!qFuzzyCompare(m_playbackRate, qreal(1.0))) m_player->setPlaybackRate(m_playbackRate); - if (!m_source.isEmpty() && (m_autoLoad || m_autoPlay)) { - m_player->setMedia(m_source, 0); + if (!m_content.isNull() && (m_autoLoad || m_autoPlay)) { + m_player->setMedia(m_content, 0); m_loaded = true; if (m_position > 0) m_player->setPosition(m_position); @@ -691,7 +692,7 @@ void QDeclarativeAudio::componentComplete() m_complete = true; if (m_autoPlay) { - if (m_source.isEmpty()) { + if (m_content.isNull()) { m_player->stop(); } else { m_player->play(); diff --git a/src/imports/multimedia/qdeclarativeaudio_p.h b/src/imports/multimedia/qdeclarativeaudio_p.h index b8a75c659..1c67bc3ad 100644 --- a/src/imports/multimedia/qdeclarativeaudio_p.h +++ b/src/imports/multimedia/qdeclarativeaudio_p.h @@ -257,6 +257,7 @@ private: QMediaPlayer::Error m_error; QString m_errorString; QUrl m_source; + QMediaContent m_content; QScopedPointer<QDeclarativeMediaMetaData> m_metaData; diff --git a/src/plugins/android/src/mediacapture/qandroidcamerasession.cpp b/src/plugins/android/src/mediacapture/qandroidcamerasession.cpp index 3ee700bf4..75b0c5e9b 100644 --- a/src/plugins/android/src/mediacapture/qandroidcamerasession.cpp +++ b/src/plugins/android/src/mediacapture/qandroidcamerasession.cpp @@ -428,6 +428,7 @@ int QAndroidCameraSession::capture(const QString &fileName) m_camera->requestPreviewFrame(); m_camera->takePicture(); } else { + //: Drive mode is the camera's shutter mode, for example single shot, continuos exposure, etc. emit imageCaptureError(m_lastImageCaptureId, QCameraImageCapture::NotSupportedFeatureError, tr("Drive mode not supported")); } diff --git a/src/plugins/wmf/decoder/mfaudiodecodercontrol.cpp b/src/plugins/wmf/decoder/mfaudiodecodercontrol.cpp index 4de9dde0d..22eb1a09c 100644 --- a/src/plugins/wmf/decoder/mfaudiodecodercontrol.cpp +++ b/src/plugins/wmf/decoder/mfaudiodecodercontrol.cpp @@ -125,7 +125,12 @@ void MFAudioDecoderControl::setSourceFilename(const QString &fileName) if (!m_sourceFilename.isEmpty()) { m_sourceResolver->shutdown(); QMediaResourceList rl; - rl.push_back(QMediaResource(QUrl::fromLocalFile(m_sourceFilename))); + QUrl url; + if (m_sourceFilename.startsWith(':')) + url = QUrl(QStringLiteral("qrc%1").arg(m_sourceFilename)); + else + url = QUrl::fromLocalFile(m_sourceFilename); + rl.push_back(QMediaResource(url)); m_sourceResolver->load(rl, 0); m_loadingSource = true; } else { diff --git a/src/plugins/wmf/mftvideo.cpp b/src/plugins/wmf/mftvideo.cpp index 8e7ce0693..7d6b3b905 100644 --- a/src/plugins/wmf/mftvideo.cpp +++ b/src/plugins/wmf/mftvideo.cpp @@ -521,18 +521,67 @@ STDMETHODIMP MFTransform::ProcessOutput(DWORD dwFlags, DWORD cOutputBufferCount, if (!m_sample) return MF_E_TRANSFORM_NEED_MORE_INPUT; - if (pOutputSamples[0].pSample) - pOutputSamples[0].pSample->Release(); + IMFMediaBuffer *input = NULL; + IMFMediaBuffer *output = NULL; + + DWORD sampleLength = 0; + m_sample->GetTotalLength(&sampleLength); + + // If the sample length is null, it means we're getting DXVA buffers. + // In that case just pass on the sample we got as input. + // Otherwise we need to copy the input buffer into the buffer the sink + // is giving us. + if (pOutputSamples[0].pSample && sampleLength > 0) { + + if (FAILED(m_sample->ConvertToContiguousBuffer(&input))) + goto done; + + if (FAILED(pOutputSamples[0].pSample->ConvertToContiguousBuffer(&output))) + goto done; + + DWORD inputLength = 0; + DWORD outputLength = 0; + input->GetMaxLength(&inputLength); + output->GetMaxLength(&outputLength); + + if (outputLength < inputLength) { + pOutputSamples[0].pSample->RemoveAllBuffers(); + output->Release(); + output = NULL; + if (SUCCEEDED(MFCreateMemoryBuffer(inputLength, &output))) + pOutputSamples[0].pSample->AddBuffer(output); + } + + if (output) + m_sample->CopyToBuffer(output); - pOutputSamples[0].pSample = m_sample; - pOutputSamples[0].pSample->AddRef(); + LONGLONG hnsDuration = 0; + LONGLONG hnsTime = 0; + if (SUCCEEDED(m_sample->GetSampleDuration(&hnsDuration))) + pOutputSamples[0].pSample->SetSampleDuration(hnsDuration); + if (SUCCEEDED(m_sample->GetSampleTime(&hnsTime))) + pOutputSamples[0].pSample->SetSampleTime(hnsTime); + + } else { + if (pOutputSamples[0].pSample) + pOutputSamples[0].pSample->Release(); + pOutputSamples[0].pSample = m_sample; + pOutputSamples[0].pSample->AddRef(); + } + +done: pOutputSamples[0].dwStatus = 0; *pdwStatus = 0; m_sample->Release(); m_sample = 0; + if (input) + input->Release(); + if (output) + output->Release(); + return S_OK; } diff --git a/src/plugins/wmf/player/mfplayersession.cpp b/src/plugins/wmf/player/mfplayersession.cpp index 4e4b56589..cca42e2ff 100644 --- a/src/plugins/wmf/player/mfplayersession.cpp +++ b/src/plugins/wmf/player/mfplayersession.cpp @@ -1875,11 +1875,22 @@ void MFPlayerSession::handleSessionEvent(IMFMediaEvent *sessionEvent) emit error(QMediaPlayer::FormatError, tr("Unsupported media, a codec is missing."), true); } else { if (m_audioSampleGrabberNode) { - IMFMediaType *mediaType = 0; - hr = MFGetTopoNodeCurrentType(m_audioSampleGrabberNode, 0, FALSE, &mediaType); - if (SUCCEEDED(hr)) { - m_audioSampleGrabber->setFormat(audioFormatForMFMediaType(mediaType)); - mediaType->Release(); + IUnknown *obj = 0; + if (SUCCEEDED(m_audioSampleGrabberNode->GetObject(&obj))) { + IMFStreamSink *streamSink = 0; + if (SUCCEEDED(obj->QueryInterface(IID_PPV_ARGS(&streamSink)))) { + IMFMediaTypeHandler *typeHandler = 0; + if (SUCCEEDED(streamSink->GetMediaTypeHandler((&typeHandler)))) { + IMFMediaType *mediaType = 0; + if (SUCCEEDED(typeHandler->GetCurrentMediaType(&mediaType))) { + m_audioSampleGrabber->setFormat(audioFormatForMFMediaType(mediaType)); + mediaType->Release(); + } + typeHandler->Release(); + } + streamSink->Release(); + } + obj->Release(); } } diff --git a/src/plugins/wmf/sourceresolver.cpp b/src/plugins/wmf/sourceresolver.cpp index 275fced96..3f39671f9 100644 --- a/src/plugins/wmf/sourceresolver.cpp +++ b/src/plugins/wmf/sourceresolver.cpp @@ -175,19 +175,16 @@ void SourceResolver::load(QMediaResourceList& resources, QIODevice* stream) 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"; + QString url; + if (!resources.isEmpty()) + url = resources.takeFirst().url().toString(); + m_stream = new MFStream(stream, false); + hr = m_sourceResolver->BeginCreateObjectFromByteStream( + m_stream, url.isEmpty() ? 0 : reinterpret_cast<LPCWSTR>(url.utf16()), + MF_RESOLUTION_MEDIASOURCE | MF_RESOLUTION_CONTENT_DOES_NOT_HAVE_TO_MATCH_EXTENSION_OR_MIME_TYPE + , NULL, &m_cancelCookie, this, new State(m_sourceResolver, true)); + if (FAILED(hr)) { + qWarning() << "Unsupported stream!"; emit error(hr); } } else { @@ -203,8 +200,10 @@ void SourceResolver::load(QMediaResourceList& resources, QIODevice* stream) 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)); + hr = m_sourceResolver->BeginCreateObjectFromByteStream( + m_stream, reinterpret_cast<const OLECHAR *>(url.toString().utf16()), + MF_RESOLUTION_MEDIASOURCE | MF_RESOLUTION_CONTENT_DOES_NOT_HAVE_TO_MATCH_EXTENSION_OR_MIME_TYPE, + NULL, &m_cancelCookie, this, new State(m_sourceResolver, true)); if (FAILED(hr)) { qWarning() << "Unsupported stream!"; emit error(hr); @@ -221,8 +220,10 @@ void SourceResolver::load(QMediaResourceList& resources, QIODevice* stream) 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)); + hr = m_sourceResolver->BeginCreateObjectFromByteStream( + m_stream, reinterpret_cast<const OLECHAR *>(url.toString().utf16()), + MF_RESOLUTION_MEDIASOURCE | MF_RESOLUTION_CONTENT_DOES_NOT_HAVE_TO_MATCH_EXTENSION_OR_MIME_TYPE, + NULL, &m_cancelCookie, this, new State(m_sourceResolver, true)); if (FAILED(hr)) { qWarning() << "Unsupported stream!"; emit error(hr); @@ -232,8 +233,10 @@ void SourceResolver::load(QMediaResourceList& resources, QIODevice* 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)); + hr = m_sourceResolver->BeginCreateObjectFromURL( + reinterpret_cast<const OLECHAR *>(url.toString().utf16()), + MF_RESOLUTION_MEDIASOURCE | MF_RESOLUTION_CONTENT_DOES_NOT_HAVE_TO_MATCH_EXTENSION_OR_MIME_TYPE, + NULL, &m_cancelCookie, this, new State(m_sourceResolver, false)); if (FAILED(hr)) { qWarning() << "Unsupported url scheme!"; emit error(hr); |