From 6f0cdc264f58d2c3b7109050d8d5799143bae34d Mon Sep 17 00:00:00 2001 From: Yoann Lopes Date: Fri, 11 Oct 2013 14:11:53 +0200 Subject: WMF: fixed compilation on Windows Vista. We were using one function which is available only on Windows 7 (and later). Replace it with Vista-compatible calls. Task-number: QTBUG-32864 Change-Id: I77492a407330c3689dfbf8dc1180894cf7ca5f8d Reviewed-by: Christian Stromme --- src/plugins/wmf/player/mfplayersession.cpp | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) (limited to 'src/plugins') 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(); } } -- cgit v1.2.3 From a23b14874cc0482e6700592d19dd2018aeb41cc5 Mon Sep 17 00:00:00 2001 From: Yoann Lopes Date: Fri, 11 Oct 2013 16:57:44 +0200 Subject: WMF: allow to load media whose content doesn't match its file extension. This also allows to play streams without providing a MIME type. Task-number: QTBUG-33631 Task-number: QTBUG-33518 Change-Id: Ia106592cb5ed0a0f7ede6308dc8e2c12cf4e63b1 Reviewed-by: Christian Stromme --- src/plugins/wmf/sourceresolver.cpp | 41 ++++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 19 deletions(-) (limited to 'src/plugins') 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(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(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(url.toString().utf16()), - MF_RESOLUTION_MEDIASOURCE, NULL, &m_cancelCookie, this, new State(m_sourceResolver, true)); + hr = m_sourceResolver->BeginCreateObjectFromByteStream( + m_stream, reinterpret_cast(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(url.toString().utf16()), - MF_RESOLUTION_MEDIASOURCE, NULL, &m_cancelCookie, this, new State(m_sourceResolver, true)); + hr = m_sourceResolver->BeginCreateObjectFromByteStream( + m_stream, reinterpret_cast(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(url.toString().utf16()), - MF_RESOLUTION_MEDIASOURCE, NULL, &m_cancelCookie, this, new State(m_sourceResolver, false)); + hr = m_sourceResolver->BeginCreateObjectFromURL( + reinterpret_cast(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); -- cgit v1.2.3 From 99c4a08c38df23fa2dd0828369f55f2ad6431d7f Mon Sep 17 00:00:00 2001 From: Yoann Lopes Date: Fri, 11 Oct 2013 18:33:45 +0200 Subject: WMF: allow to set a qrc file name as source of a QAudioDecoder. Task-number: QTBUG-33518 Change-Id: I01d8a1fa7b9a1c3ea2af9de6033dff2773cd6ace Reviewed-by: Christian Stromme --- src/plugins/wmf/decoder/mfaudiodecodercontrol.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'src/plugins') 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 { -- cgit v1.2.3 From 98a6eefda90926e2fb862600cf319cd701b057b5 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Tue, 15 Oct 2013 09:26:33 +0200 Subject: Add Linguist comment for translation of Drive-mode. Translators not familiar with cameras might mistake it for something related to driving a car. Change-Id: If54a563a32af537d291b79253056b7b57e108f5b Reviewed-by: Robert Loehning Reviewed-by: Andy Nichols --- src/plugins/android/src/mediacapture/qandroidcamerasession.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'src/plugins') 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")); } -- cgit v1.2.3 From 068169528c5e8a281b448c21d6eb5dbd88911dc0 Mon Sep 17 00:00:00 2001 From: Yoann Lopes Date: Mon, 14 Oct 2013 19:27:22 +0200 Subject: WMF: fix output samples from our video probe MFTransform. The EVR sink allocates its buffers and expect the node connected to it to use them. Our video probe MFTransform should therefore copy the input buffers into the EVR buffers rather than just passing on the input buffers. Task-number: QTBUG-30435 Change-Id: I978479ced341b96ce627c682f99662dec1dfdb3f Reviewed-by: Christian Stromme --- src/plugins/wmf/mftvideo.cpp | 57 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 53 insertions(+), 4 deletions(-) (limited to 'src/plugins') 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; } -- cgit v1.2.3