summaryrefslogtreecommitdiffstats
path: root/src/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/android/src/common/qandroidvideooutput.cpp2
-rw-r--r--src/plugins/android/videonode/qandroidsgvideonodeplugin.cpp2
-rw-r--r--src/plugins/common/evr/evrcustompresenter.cpp2
-rw-r--r--src/plugins/directshow/player/directshowmetadatacontrol.cpp139
-rw-r--r--src/plugins/directshow/player/directshowmetadatacontrol.h8
-rw-r--r--src/plugins/directshow/player/directshowplayerservice.cpp25
-rw-r--r--src/plugins/directshow/player/directshowplayerservice.h2
-rw-r--r--src/plugins/directshow/player/videosurfacefilter.cpp1
-rw-r--r--src/plugins/gstreamer/camerabin/camerabinsession.cpp11
-rw-r--r--src/plugins/pulseaudio/qaudiooutput_pulse.cpp29
-rw-r--r--src/plugins/wmf/decoder/mfaudiodecodercontrol.cpp6
-rw-r--r--src/plugins/wmf/player/mfplayersession.cpp6
-rw-r--r--src/plugins/wmf/sourceresolver.cpp10
-rw-r--r--src/plugins/wmf/sourceresolver.h2
14 files changed, 129 insertions, 116 deletions
diff --git a/src/plugins/android/src/common/qandroidvideooutput.cpp b/src/plugins/android/src/common/qandroidvideooutput.cpp
index b425b9d89..eeaf70982 100644
--- a/src/plugins/android/src/common/qandroidvideooutput.cpp
+++ b/src/plugins/android/src/common/qandroidvideooutput.cpp
@@ -314,7 +314,7 @@ void QAndroidTextureVideoOutput::onFrameAvailable()
return;
QAbstractVideoBuffer *buffer = new AndroidTextureVideoBuffer(this, m_nativeSize);
- QVideoFrame frame(buffer, m_nativeSize, QVideoFrame::Format_BGR32);
+ QVideoFrame frame(buffer, m_nativeSize, QVideoFrame::Format_ABGR32);
if (m_surface->isActive() && (m_surface->surfaceFormat().pixelFormat() != frame.pixelFormat()
|| m_surface->surfaceFormat().frameSize() != frame.size())) {
diff --git a/src/plugins/android/videonode/qandroidsgvideonodeplugin.cpp b/src/plugins/android/videonode/qandroidsgvideonodeplugin.cpp
index e69c9c16e..d70c8100b 100644
--- a/src/plugins/android/videonode/qandroidsgvideonodeplugin.cpp
+++ b/src/plugins/android/videonode/qandroidsgvideonodeplugin.cpp
@@ -48,7 +48,7 @@ QList<QVideoFrame::PixelFormat> QAndroidSGVideoNodeFactoryPlugin::supportedPixel
QList<QVideoFrame::PixelFormat> pixelFormats;
if (handleType == QAbstractVideoBuffer::GLTextureHandle)
- pixelFormats.append(QVideoFrame::Format_BGR32);
+ pixelFormats.append(QVideoFrame::Format_ABGR32);
return pixelFormats;
}
diff --git a/src/plugins/common/evr/evrcustompresenter.cpp b/src/plugins/common/evr/evrcustompresenter.cpp
index 872b97bcc..fdaedea7a 100644
--- a/src/plugins/common/evr/evrcustompresenter.cpp
+++ b/src/plugins/common/evr/evrcustompresenter.cpp
@@ -1208,6 +1208,8 @@ HRESULT EVRCustomPresenter::checkEndOfStream()
// Everything is complete. Now we can tell the EVR that we are done.
notifyEvent(EC_COMPLETE, (LONG_PTR)S_OK, 0);
m_endStreaming = false;
+
+ stopSurface();
return S_OK;
}
diff --git a/src/plugins/directshow/player/directshowmetadatacontrol.cpp b/src/plugins/directshow/player/directshowmetadatacontrol.cpp
index 90d2b3e7d..52b73a7df 100644
--- a/src/plugins/directshow/player/directshowmetadatacontrol.cpp
+++ b/src/plugins/directshow/player/directshowmetadatacontrol.cpp
@@ -477,21 +477,14 @@ static QString convertBSTR(BSTR *string)
return value;
}
-void DirectShowMetaDataControl::reset()
+void DirectShowMetaDataControl::setMetadata(const QVariantMap &metadata)
{
- bool hadMetadata = !m_metadata.isEmpty();
- m_metadata.clear();
-
- setMetadataAvailable(false);
-
- if (hadMetadata)
- emit metaDataChanged();
+ m_metadata = metadata;
+ setMetadataAvailable(!m_metadata.isEmpty());
}
-void DirectShowMetaDataControl::updateMetadata(IFilterGraph2 *graph, IBaseFilter *source, const QString &fileSrc)
+void DirectShowMetaDataControl::updateMetadata(const QString &fileSrc, QVariantMap &metadata)
{
- m_metadata.clear();
-
#if QT_CONFIG(wshellitem)
if (!sHCreateItemFromParsingName) {
QSystemLibrary lib(QStringLiteral("shell32"));
@@ -518,90 +511,90 @@ void DirectShowMetaDataControl::updateMetadata(IFilterGraph2 *graph, IBaseFilter
continue;
if (IsEqualPropertyKey(key, PKEY_Author)) {
- m_metadata.insert(QMediaMetaData::Author, convertValue(var));
+ metadata.insert(QMediaMetaData::Author, convertValue(var));
} else if (IsEqualPropertyKey(key, PKEY_Title)) {
- m_metadata.insert(QMediaMetaData::Title, convertValue(var));
+ metadata.insert(QMediaMetaData::Title, convertValue(var));
} else if (IsEqualPropertyKey(key, PKEY_Media_SubTitle)) {
- m_metadata.insert(QMediaMetaData::SubTitle, convertValue(var));
+ metadata.insert(QMediaMetaData::SubTitle, convertValue(var));
} else if (IsEqualPropertyKey(key, PKEY_ParentalRating)) {
- m_metadata.insert(QMediaMetaData::ParentalRating, convertValue(var));
+ metadata.insert(QMediaMetaData::ParentalRating, convertValue(var));
} else if (IsEqualPropertyKey(key, PKEY_Comment)) {
- m_metadata.insert(QMediaMetaData::Description, convertValue(var));
+ metadata.insert(QMediaMetaData::Description, convertValue(var));
} else if (IsEqualPropertyKey(key, PKEY_Copyright)) {
- m_metadata.insert(QMediaMetaData::Copyright, convertValue(var));
+ metadata.insert(QMediaMetaData::Copyright, convertValue(var));
} else if (IsEqualPropertyKey(key, PKEY_Media_ProviderStyle)) {
- m_metadata.insert(QMediaMetaData::Genre, convertValue(var));
+ metadata.insert(QMediaMetaData::Genre, convertValue(var));
} else if (IsEqualPropertyKey(key, PKEY_Media_Year)) {
- m_metadata.insert(QMediaMetaData::Year, convertValue(var));
+ metadata.insert(QMediaMetaData::Year, convertValue(var));
} else if (IsEqualPropertyKey(key, PKEY_Media_DateEncoded)) {
- m_metadata.insert(QMediaMetaData::Date, convertValue(var));
+ metadata.insert(QMediaMetaData::Date, convertValue(var));
} else if (IsEqualPropertyKey(key, PKEY_Rating)) {
- m_metadata.insert(QMediaMetaData::UserRating,
+ metadata.insert(QMediaMetaData::UserRating,
int((convertValue(var).toUInt() - 1) / qreal(98) * 100));
} else if (IsEqualPropertyKey(key, PKEY_Keywords)) {
- m_metadata.insert(QMediaMetaData::Keywords, convertValue(var));
+ metadata.insert(QMediaMetaData::Keywords, convertValue(var));
} else if (IsEqualPropertyKey(key, PKEY_Language)) {
- m_metadata.insert(QMediaMetaData::Language, convertValue(var));
+ metadata.insert(QMediaMetaData::Language, convertValue(var));
} else if (IsEqualPropertyKey(key, PKEY_Media_Publisher)) {
- m_metadata.insert(QMediaMetaData::Publisher, convertValue(var));
+ metadata.insert(QMediaMetaData::Publisher, convertValue(var));
} else if (IsEqualPropertyKey(key, PKEY_Media_Duration)) {
- m_metadata.insert(QMediaMetaData::Duration,
+ metadata.insert(QMediaMetaData::Duration,
(convertValue(var).toLongLong() + 10000) / 10000);
} else if (IsEqualPropertyKey(key, PKEY_Audio_EncodingBitrate)) {
- m_metadata.insert(QMediaMetaData::AudioBitRate, convertValue(var));
+ metadata.insert(QMediaMetaData::AudioBitRate, convertValue(var));
} else if (IsEqualPropertyKey(key, PKEY_Media_AverageLevel)) {
- m_metadata.insert(QMediaMetaData::AverageLevel, convertValue(var));
+ metadata.insert(QMediaMetaData::AverageLevel, convertValue(var));
} else if (IsEqualPropertyKey(key, PKEY_Audio_ChannelCount)) {
- m_metadata.insert(QMediaMetaData::ChannelCount, convertValue(var));
+ metadata.insert(QMediaMetaData::ChannelCount, convertValue(var));
} else if (IsEqualPropertyKey(key, PKEY_Audio_PeakValue)) {
- m_metadata.insert(QMediaMetaData::PeakValue, convertValue(var));
+ metadata.insert(QMediaMetaData::PeakValue, convertValue(var));
} else if (IsEqualPropertyKey(key, PKEY_Audio_SampleRate)) {
- m_metadata.insert(QMediaMetaData::SampleRate, convertValue(var));
+ metadata.insert(QMediaMetaData::SampleRate, convertValue(var));
} else if (IsEqualPropertyKey(key, PKEY_Music_AlbumTitle)) {
- m_metadata.insert(QMediaMetaData::AlbumTitle, convertValue(var));
+ metadata.insert(QMediaMetaData::AlbumTitle, convertValue(var));
} else if (IsEqualPropertyKey(key, PKEY_Music_AlbumArtist)) {
- m_metadata.insert(QMediaMetaData::AlbumArtist, convertValue(var));
+ metadata.insert(QMediaMetaData::AlbumArtist, convertValue(var));
} else if (IsEqualPropertyKey(key, PKEY_Music_Artist)) {
- m_metadata.insert(QMediaMetaData::ContributingArtist, convertValue(var));
+ metadata.insert(QMediaMetaData::ContributingArtist, convertValue(var));
} else if (IsEqualPropertyKey(key, PKEY_Music_Composer)) {
- m_metadata.insert(QMediaMetaData::Composer, convertValue(var));
+ metadata.insert(QMediaMetaData::Composer, convertValue(var));
} else if (IsEqualPropertyKey(key, PKEY_Music_Conductor)) {
- m_metadata.insert(QMediaMetaData::Conductor, convertValue(var));
+ metadata.insert(QMediaMetaData::Conductor, convertValue(var));
} else if (IsEqualPropertyKey(key, PKEY_Music_Lyrics)) {
- m_metadata.insert(QMediaMetaData::Lyrics, convertValue(var));
+ metadata.insert(QMediaMetaData::Lyrics, convertValue(var));
} else if (IsEqualPropertyKey(key, PKEY_Music_Mood)) {
- m_metadata.insert(QMediaMetaData::Mood, convertValue(var));
+ metadata.insert(QMediaMetaData::Mood, convertValue(var));
} else if (IsEqualPropertyKey(key, PKEY_Music_TrackNumber)) {
- m_metadata.insert(QMediaMetaData::TrackNumber, convertValue(var));
+ metadata.insert(QMediaMetaData::TrackNumber, convertValue(var));
} else if (IsEqualPropertyKey(key, PKEY_Music_Genre)) {
- m_metadata.insert(QMediaMetaData::Genre, convertValue(var));
+ metadata.insert(QMediaMetaData::Genre, convertValue(var));
} else if (IsEqualPropertyKey(key, PKEY_ThumbnailStream)) {
- m_metadata.insert(QMediaMetaData::ThumbnailImage, convertValue(var));
+ metadata.insert(QMediaMetaData::ThumbnailImage, convertValue(var));
} else if (IsEqualPropertyKey(key, PKEY_Video_FrameHeight)) {
QSize res;
res.setHeight(convertValue(var).toUInt());
if (SUCCEEDED(pStore->GetValue(PKEY_Video_FrameWidth, &var)))
res.setWidth(convertValue(var).toUInt());
- m_metadata.insert(QMediaMetaData::Resolution, res);
+ metadata.insert(QMediaMetaData::Resolution, res);
} else if (IsEqualPropertyKey(key, PKEY_Video_HorizontalAspectRatio)) {
QSize aspectRatio;
aspectRatio.setWidth(convertValue(var).toUInt());
if (SUCCEEDED(pStore->GetValue(PKEY_Video_VerticalAspectRatio, &var)))
aspectRatio.setHeight(convertValue(var).toUInt());
- m_metadata.insert(QMediaMetaData::PixelAspectRatio, aspectRatio);
+ metadata.insert(QMediaMetaData::PixelAspectRatio, aspectRatio);
} else if (IsEqualPropertyKey(key, PKEY_Video_FrameRate)) {
- m_metadata.insert(QMediaMetaData::VideoFrameRate,
+ metadata.insert(QMediaMetaData::VideoFrameRate,
convertValue(var).toReal() / 1000);
} else if (IsEqualPropertyKey(key, PKEY_Video_EncodingBitrate)) {
- m_metadata.insert(QMediaMetaData::VideoBitRate, convertValue(var));
+ metadata.insert(QMediaMetaData::VideoBitRate, convertValue(var));
} else if (IsEqualPropertyKey(key, PKEY_Video_Director)) {
- m_metadata.insert(QMediaMetaData::Director, convertValue(var));
+ metadata.insert(QMediaMetaData::Director, convertValue(var));
} else if (IsEqualPropertyKey(key, PKEY_Media_Writer)) {
- m_metadata.insert(QMediaMetaData::Writer, convertValue(var));
+ metadata.insert(QMediaMetaData::Writer, convertValue(var));
} else if (IsEqualPropertyKey(key, PKEY_Video_Compression)) {
- m_metadata.insert(QMediaMetaData::VideoCodec, nameForGUIDString(convertValue(var).toString()));
+ metadata.insert(QMediaMetaData::VideoCodec, nameForGUIDString(convertValue(var).toString()));
} else if (IsEqualPropertyKey(key, PKEY_Audio_Format)) {
- m_metadata.insert(QMediaMetaData::AudioCodec, nameForGUIDString(convertValue(var).toString()));
+ metadata.insert(QMediaMetaData::AudioCodec, nameForGUIDString(convertValue(var).toString()));
}
PropVariantClear(&var);
@@ -614,11 +607,14 @@ void DirectShowMetaDataControl::updateMetadata(IFilterGraph2 *graph, IBaseFilter
shellItem->Release();
}
}
-
- if (!m_metadata.isEmpty())
- goto send_event;
+#else
+ Q_UNUSED(fileSrc);
+ Q_UNUSED(metadata);
#endif
+}
+void DirectShowMetaDataControl::updateMetadata(IFilterGraph2 *graph, IBaseFilter *source, QVariantMap &metadata)
+{
#if QT_CONFIG(wmsdk)
if (IWMHeaderInfo *info = com_cast<IWMHeaderInfo>(source, IID_IWMHeaderInfo)) {
const auto keys = *qt_wmMetaDataKeys();
@@ -644,15 +640,15 @@ void DirectShowMetaDataControl::updateMetadata(IFilterGraph2 *graph, IBaseFilter
var = (var.toUInt() - 1) / qreal(98) * 100;
}
- m_metadata.insert(key.qtName, var);
+ metadata.insert(key.qtName, var);
}
}
info->Release();
}
- if (!m_metadata.isEmpty())
- goto send_event;
+ if (!metadata.isEmpty())
+ return;
#endif
{
IAMMediaContent *content = 0;
@@ -668,41 +664,23 @@ void DirectShowMetaDataControl::updateMetadata(IFilterGraph2 *graph, IBaseFilter
BSTR string = 0;
if (content->get_AuthorName(&string) == S_OK)
- m_metadata.insert(QMediaMetaData::Author, convertBSTR(&string));
+ metadata.insert(QMediaMetaData::Author, convertBSTR(&string));
if (content->get_Title(&string) == S_OK)
- m_metadata.insert(QMediaMetaData::Title, convertBSTR(&string));
+ metadata.insert(QMediaMetaData::Title, convertBSTR(&string));
if (content->get_Description(&string) == S_OK)
- m_metadata.insert(QMediaMetaData::Description, convertBSTR(&string));
+ metadata.insert(QMediaMetaData::Description, convertBSTR(&string));
if (content->get_Rating(&string) == S_OK)
- m_metadata.insert(QMediaMetaData::UserRating, convertBSTR(&string));
+ metadata.insert(QMediaMetaData::UserRating, convertBSTR(&string));
if (content->get_Copyright(&string) == S_OK)
- m_metadata.insert(QMediaMetaData::Copyright, convertBSTR(&string));
+ metadata.insert(QMediaMetaData::Copyright, convertBSTR(&string));
content->Release();
}
}
-
-send_event:
- // DirectShowMediaPlayerService holds a lock at this point so defer emitting signals to a later
- // time.
- QCoreApplication::postEvent(this, new QEvent(QEvent::Type(MetaDataChanged)));
-}
-
-void DirectShowMetaDataControl::customEvent(QEvent *event)
-{
- if (event->type() == QEvent::Type(MetaDataChanged)) {
- event->accept();
-
- setMetadataAvailable(!m_metadata.isEmpty());
-
- emit metaDataChanged();
- } else {
- QMetaDataReaderControl::customEvent(event);
- }
}
void DirectShowMetaDataControl::setMetadataAvailable(bool available)
@@ -711,5 +689,10 @@ void DirectShowMetaDataControl::setMetadataAvailable(bool available)
return;
m_available = available;
- emit metaDataAvailableChanged(m_available);
+
+ // If the metadata is not available, notify about it immediately.
+ Qt::ConnectionType type = m_available ? Qt::QueuedConnection : Qt::AutoConnection;
+ QMetaObject::invokeMethod(this, "metaDataAvailableChanged", type, Q_ARG(bool, m_available));
+ // Currently the metadata is changed only with its availability.
+ QMetaObject::invokeMethod(this, "metaDataChanged", type);
}
diff --git a/src/plugins/directshow/player/directshowmetadatacontrol.h b/src/plugins/directshow/player/directshowmetadatacontrol.h
index ea20bf0c5..4196a7950 100644
--- a/src/plugins/directshow/player/directshowmetadatacontrol.h
+++ b/src/plugins/directshow/player/directshowmetadatacontrol.h
@@ -62,12 +62,10 @@ public:
QVariant metaData(const QString &key) const override;
QStringList availableMetaData() const override;
- void reset();
- void updateMetadata(IFilterGraph2 *graph, IBaseFilter *source,
- const QString &fileSrc = QString());
+ void setMetadata(const QVariantMap &metadata);
-protected:
- void customEvent(QEvent *event) override;
+ static void updateMetadata(const QString &fileSrc, QVariantMap &metadata);
+ static void updateMetadata(IFilterGraph2 *graph, IBaseFilter *source, QVariantMap &metadata);
private:
void setMetadataAvailable(bool available);
diff --git a/src/plugins/directshow/player/directshowplayerservice.cpp b/src/plugins/directshow/player/directshowplayerservice.cpp
index 08d99d735..f6106724b 100644
--- a/src/plugins/directshow/player/directshowplayerservice.cpp
+++ b/src/plugins/directshow/player/directshowplayerservice.cpp
@@ -297,7 +297,7 @@ void DirectShowPlayerService::load(const QMediaContent &media, QIODevice *stream
if (m_graph)
releaseGraph();
- m_resources = media.resources();
+ m_url = media.canonicalUrl();
m_stream = stream;
m_error = QMediaPlayer::NoError;
m_errorString = QString();
@@ -310,13 +310,11 @@ void DirectShowPlayerService::load(const QMediaContent &media, QIODevice *stream
m_seekable = false;
m_atEnd = false;
m_dontCacheNextSeekResult = false;
- m_metaDataControl->reset();
+ m_metaDataControl->setMetadata(QVariantMap());
- if (m_resources.isEmpty() && !stream) {
+ if (m_url.isEmpty() && !stream) {
m_pendingTasks = 0;
m_graphStatus = NoMedia;
-
- m_url.clear();
} else if (stream && (!stream->isReadable() || stream->isSequential())) {
m_pendingTasks = 0;
m_graphStatus = InvalidMedia;
@@ -348,9 +346,6 @@ void DirectShowPlayerService::doSetUrlSource(QMutexLocker *locker)
{
IBaseFilter *source = 0;
- QMediaResource resource = m_resources.takeFirst();
- m_url = resource.url();
-
HRESULT hr = E_FAIL;
if (m_url.scheme() == QLatin1String("http") || m_url.scheme() == QLatin1String("https")) {
static const GUID clsid_WMAsfReader = {
@@ -403,7 +398,7 @@ void DirectShowPlayerService::doSetUrlSource(QMutexLocker *locker)
m_pendingTasks |= SetRate;
m_source = source;
- } else if (!m_resources.isEmpty()) {
+ } else if (!m_url.isEmpty()) {
m_pendingTasks |= SetUrlSource;
} else {
m_graphStatus = InvalidMedia;
@@ -596,7 +591,6 @@ void DirectShowPlayerService::doRender(QMutexLocker *locker)
void DirectShowPlayerService::doFinalizeLoad(QMutexLocker *locker)
{
- Q_UNUSED(locker)
if (m_graphStatus != Loaded) {
if (IMediaEvent *event = com_cast<IMediaEvent>(m_graph, IID_IMediaEvent)) {
event->GetEventHandle(reinterpret_cast<OAEVENT *>(&m_eventHandle));
@@ -625,6 +619,11 @@ void DirectShowPlayerService::doFinalizeLoad(QMutexLocker *locker)
m_graphStatus = Loaded;
+ // Do not block gui thread while updating metadata from file.
+ locker->unlock();
+ DirectShowMetaDataControl::updateMetadata(m_url.toString(), m_metadata);
+ locker->relock();
+
QCoreApplication::postEvent(this, new QEvent(QEvent::Type(FinalizedLoad)));
}
@@ -1406,7 +1405,11 @@ void DirectShowPlayerService::customEvent(QEvent *event)
QMutexLocker locker(&m_mutex);
m_playerControl->updateMediaInfo(m_duration, m_streamTypes, m_seekable);
- m_metaDataControl->updateMetadata(m_graph, m_source, m_url.toString());
+ if (m_metadata.isEmpty())
+ DirectShowMetaDataControl::updateMetadata(m_graph, m_source, m_metadata);
+
+ m_metaDataControl->setMetadata(m_metadata);
+ m_metadata.clear();
updateStatus();
} else if (event->type() == QEvent::Type(Error)) {
diff --git a/src/plugins/directshow/player/directshowplayerservice.h b/src/plugins/directshow/player/directshowplayerservice.h
index 4a9e25678..729a189aa 100644
--- a/src/plugins/directshow/player/directshowplayerservice.h
+++ b/src/plugins/directshow/player/directshowplayerservice.h
@@ -224,13 +224,13 @@ private:
qint64 m_duration;
QMediaTimeRange m_playbackRange;
QUrl m_url;
- QMediaResourceList m_resources;
QString m_errorString;
QMutex m_mutex;
bool m_buffering;
bool m_seekable;
bool m_atEnd;
bool m_dontCacheNextSeekResult;
+ QVariantMap m_metadata;
friend class DirectShowPlayerServiceThread;
};
diff --git a/src/plugins/directshow/player/videosurfacefilter.cpp b/src/plugins/directshow/player/videosurfacefilter.cpp
index 826d26bdb..74d59231c 100644
--- a/src/plugins/directshow/player/videosurfacefilter.cpp
+++ b/src/plugins/directshow/player/videosurfacefilter.cpp
@@ -462,6 +462,7 @@ HRESULT VideoSurfaceFilter::EndOfStream()
if (!m_pendingSample && m_running)
checkEOS();
+ stopSurface();
return S_OK;
}
diff --git a/src/plugins/gstreamer/camerabin/camerabinsession.cpp b/src/plugins/gstreamer/camerabin/camerabinsession.cpp
index fdedc5f5a..ebb797189 100644
--- a/src/plugins/gstreamer/camerabin/camerabinsession.cpp
+++ b/src/plugins/gstreamer/camerabin/camerabinsession.cpp
@@ -1177,11 +1177,16 @@ void CameraBinSession::recordVideo()
if (format.isEmpty())
format = m_mediaContainerControl->actualContainerFormat();
- const QString actualFileName = m_mediaStorageLocation.generateFileName(m_sink.isLocalFile() ? m_sink.toLocalFile()
- : m_sink.toString(),
+ const QString fileName = m_sink.isLocalFile() ? m_sink.toLocalFile() : m_sink.toString();
+ const QFileInfo fileInfo(fileName);
+ const QString extension = fileInfo.suffix().isEmpty()
+ ? QGstUtils::fileExtensionForMimeType(format)
+ : fileInfo.suffix();
+
+ const QString actualFileName = m_mediaStorageLocation.generateFileName(fileName,
QMediaStorageLocation::Movies,
QLatin1String("clip_"),
- QGstUtils::fileExtensionForMimeType(format));
+ extension);
m_recordingActive = true;
m_actualSink = QUrl::fromLocalFile(actualFileName);
diff --git a/src/plugins/pulseaudio/qaudiooutput_pulse.cpp b/src/plugins/pulseaudio/qaudiooutput_pulse.cpp
index ea7a2be0c..b4bd1c55c 100644
--- a/src/plugins/pulseaudio/qaudiooutput_pulse.cpp
+++ b/src/plugins/pulseaudio/qaudiooutput_pulse.cpp
@@ -310,7 +310,34 @@ bool QPulseAudioOutput::open()
if (!m_category.isNull())
pa_proplist_sets(propList, PA_PROP_MEDIA_ROLE, m_category.toLatin1().constData());
- m_stream = pa_stream_new_with_proplist(pulseEngine->context(), m_streamName.constData(), &m_spec, 0, propList);
+ static const auto mapName = qEnvironmentVariable("QT_PA_CHANNEL_MAP");
+ pa_channel_map_def_t mapDef = PA_CHANNEL_MAP_DEFAULT;
+ if (mapName == QLatin1String("ALSA"))
+ mapDef = PA_CHANNEL_MAP_ALSA;
+ else if (mapName == QLatin1String("AUX"))
+ mapDef = PA_CHANNEL_MAP_AUX;
+ else if (mapName == QLatin1String("WAVEEX"))
+ mapDef = PA_CHANNEL_MAP_WAVEEX;
+ else if (mapName == QLatin1String("OSS"))
+ mapDef = PA_CHANNEL_MAP_OSS;
+ else if (!mapName.isEmpty())
+ qWarning() << "Unknown pulse audio channel mapping definition:" << mapName;
+
+ pa_channel_map m;
+ auto channelMap = pa_channel_map_init_extend(&m, m_spec.channels, mapDef);
+ if (!channelMap)
+ qWarning() << "QAudioOutput: pa_channel_map_init_extend() Could not initialize channel map";
+
+ m_stream = pa_stream_new_with_proplist(pulseEngine->context(), m_streamName.constData(), &m_spec, channelMap, propList);
+ if (!m_stream) {
+ qWarning() << "QAudioOutput: pa_stream_new_with_proplist() failed!";
+ pulseEngine->unlock();
+ setError(QAudio::OpenError);
+ setState(QAudio::StoppedState);
+ emit stateChanged(m_deviceState);
+ return false;
+ }
+
pa_proplist_free(propList);
pa_stream_set_state_callback(m_stream, outputStreamStateCallback, this);
diff --git a/src/plugins/wmf/decoder/mfaudiodecodercontrol.cpp b/src/plugins/wmf/decoder/mfaudiodecodercontrol.cpp
index 438c2aae0..c0eada324 100644
--- a/src/plugins/wmf/decoder/mfaudiodecodercontrol.cpp
+++ b/src/plugins/wmf/decoder/mfaudiodecodercontrol.cpp
@@ -124,14 +124,12 @@ void MFAudioDecoderControl::setSourceFilename(const QString &fileName)
m_sourceFilename = fileName;
if (!m_sourceFilename.isEmpty()) {
m_sourceResolver->shutdown();
- QMediaResourceList rl;
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_sourceResolver->load(url, 0);
m_loadingSource = true;
} else {
onSourceCleared();
@@ -155,7 +153,7 @@ void MFAudioDecoderControl::setSourceDevice(QIODevice *device)
m_device = device;
if (m_device) {
m_sourceResolver->shutdown();
- m_sourceResolver->load(QMediaResourceList(), m_device);
+ m_sourceResolver->load(QUrl(), m_device);
m_loadingSource = true;
} else {
onSourceCleared();
diff --git a/src/plugins/wmf/player/mfplayersession.cpp b/src/plugins/wmf/player/mfplayersession.cpp
index 3219936a7..9f909252d 100644
--- a/src/plugins/wmf/player/mfplayersession.cpp
+++ b/src/plugins/wmf/player/mfplayersession.cpp
@@ -197,12 +197,12 @@ void MFPlayerSession::load(const QMediaContent &media, QIODevice *stream)
qDebug() << "load";
#endif
clear();
- QMediaResourceList resources = media.resources();
+ QUrl url = media.canonicalUrl();
if (m_status == QMediaPlayer::LoadingMedia && m_sourceResolver)
m_sourceResolver->cancel();
- if (resources.isEmpty() && !stream) {
+ if (url.isEmpty() && !stream) {
changeStatus(QMediaPlayer::NoMedia);
} else if (stream && (!stream->isReadable())) {
changeStatus(QMediaPlayer::InvalidMedia);
@@ -210,7 +210,7 @@ void MFPlayerSession::load(const QMediaContent &media, QIODevice *stream)
} else {
createSession();
changeStatus(QMediaPlayer::LoadingMedia);
- m_sourceResolver->load(resources, stream);
+ m_sourceResolver->load(url, stream);
}
emit positionChanged(position());
}
diff --git a/src/plugins/wmf/sourceresolver.cpp b/src/plugins/wmf/sourceresolver.cpp
index 83949c976..c6f4e8566 100644
--- a/src/plugins/wmf/sourceresolver.cpp
+++ b/src/plugins/wmf/sourceresolver.cpp
@@ -158,7 +158,7 @@ HRESULT STDMETHODCALLTYPE SourceResolver::GetParameters(DWORD*, DWORD*)
return E_NOTIMPL;
}
-void SourceResolver::load(const QMediaResourceList &resources, QIODevice* stream)
+void SourceResolver::load(const QUrl &url, QIODevice* stream)
{
QMutexLocker locker(&m_mutex);
HRESULT hr = S_OK;
@@ -174,12 +174,10 @@ void SourceResolver::load(const QMediaResourceList &resources, QIODevice* stream
qWarning() << "Failed to create Source Resolver!";
emit error(hr);
} else if (stream) {
- QString url;
- if (!resources.isEmpty())
- url = resources.constFirst().url().toString();
+ QString urlString = url.toString();
m_stream = new MFStream(stream, false);
hr = m_sourceResolver->BeginCreateObjectFromByteStream(
- m_stream, url.isEmpty() ? 0 : reinterpret_cast<LPCWSTR>(url.utf16()),
+ m_stream, urlString.isEmpty() ? 0 : reinterpret_cast<LPCWSTR>(urlString.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)) {
@@ -187,8 +185,6 @@ void SourceResolver::load(const QMediaResourceList &resources, QIODevice* stream
emit error(hr);
}
} else {
- QMediaResource resource = resources.constFirst();
- QUrl url = resource.url();
#ifdef DEBUG_MEDIAFOUNDATION
qDebug() << "loading :" << url;
qDebug() << "url path =" << url.path().mid(1);
diff --git a/src/plugins/wmf/sourceresolver.h b/src/plugins/wmf/sourceresolver.h
index 387f59739..aa104a60e 100644
--- a/src/plugins/wmf/sourceresolver.h
+++ b/src/plugins/wmf/sourceresolver.h
@@ -59,7 +59,7 @@ public:
HRESULT STDMETHODCALLTYPE GetParameters(DWORD*, DWORD*);
- void load(const QMediaResourceList &resources, QIODevice* stream);
+ void load(const QUrl &url, QIODevice* stream);
void cancel();