diff options
192 files changed, 1636 insertions, 1361 deletions
diff --git a/.qmake.conf b/.qmake.conf index 543d0a842..f6895bb09 100644 --- a/.qmake.conf +++ b/.qmake.conf @@ -1,3 +1,5 @@ load(qt_build_config) -MODULE_VERSION = 5.13.2 +DEFINES += QT_NO_FOREACH QT_NO_JAVA_STYLE_ITERATORS QT_NO_LINKED_LIST + +MODULE_VERSION = 5.14.0 diff --git a/examples/multimedia/audiodevices/audiodevices.cpp b/examples/multimedia/audiodevices/audiodevices.cpp index 468dbc659..52ff2176a 100644 --- a/examples/multimedia/audiodevices/audiodevices.cpp +++ b/examples/multimedia/audiodevices/audiodevices.cpp @@ -150,7 +150,7 @@ void AudioTest::modeChanged(int idx) deviceBox->clear(); const QAudio::Mode mode = idx == 0 ? QAudio::AudioInput : QAudio::AudioOutput; for (auto &deviceInfo: QAudioDeviceInfo::availableDevices(mode)) - deviceBox->addItem(deviceInfo.deviceName(), qVariantFromValue(deviceInfo)); + deviceBox->addItem(deviceInfo.deviceName(), QVariant::fromValue(deviceInfo)); deviceBox->setCurrentIndex(0); deviceChanged(0); diff --git a/examples/multimedia/audioinput/audioinput.cpp b/examples/multimedia/audioinput/audioinput.cpp index ec6088780..86da20d51 100644 --- a/examples/multimedia/audioinput/audioinput.cpp +++ b/examples/multimedia/audioinput/audioinput.cpp @@ -239,10 +239,10 @@ void InputTest::initializeWindow() m_deviceBox = new QComboBox(this); const QAudioDeviceInfo &defaultDeviceInfo = QAudioDeviceInfo::defaultInputDevice(); - m_deviceBox->addItem(defaultDeviceInfo.deviceName(), qVariantFromValue(defaultDeviceInfo)); + m_deviceBox->addItem(defaultDeviceInfo.deviceName(), QVariant::fromValue(defaultDeviceInfo)); for (auto &deviceInfo: QAudioDeviceInfo::availableDevices(QAudio::AudioInput)) { if (deviceInfo != defaultDeviceInfo) - m_deviceBox->addItem(deviceInfo.deviceName(), qVariantFromValue(deviceInfo)); + m_deviceBox->addItem(deviceInfo.deviceName(), QVariant::fromValue(deviceInfo)); } connect(m_deviceBox, QOverload<int>::of(&QComboBox::activated), this, &InputTest::deviceChanged); diff --git a/examples/multimedia/audiooutput/audiooutput.cpp b/examples/multimedia/audiooutput/audiooutput.cpp index 229727422..69b4470be 100644 --- a/examples/multimedia/audiooutput/audiooutput.cpp +++ b/examples/multimedia/audiooutput/audiooutput.cpp @@ -169,10 +169,10 @@ void AudioTest::initializeWindow() m_deviceBox = new QComboBox(this); const QAudioDeviceInfo &defaultDeviceInfo = QAudioDeviceInfo::defaultOutputDevice(); - m_deviceBox->addItem(defaultDeviceInfo.deviceName(), qVariantFromValue(defaultDeviceInfo)); + m_deviceBox->addItem(defaultDeviceInfo.deviceName(), QVariant::fromValue(defaultDeviceInfo)); for (auto &deviceInfo: QAudioDeviceInfo::availableDevices(QAudio::AudioOutput)) { if (deviceInfo != defaultDeviceInfo) - m_deviceBox->addItem(deviceInfo.deviceName(), qVariantFromValue(deviceInfo)); + m_deviceBox->addItem(deviceInfo.deviceName(), QVariant::fromValue(deviceInfo)); } connect(m_deviceBox, QOverload<int>::of(&QComboBox::activated), this, &AudioTest::deviceChanged); layout->addWidget(m_deviceBox); diff --git a/examples/multimedia/spectrum/app/engine.cpp b/examples/multimedia/spectrum/app/engine.cpp index 7e11d012b..fd977785b 100644 --- a/examples/multimedia/spectrum/app/engine.cpp +++ b/examples/multimedia/spectrum/app/engine.cpp @@ -570,14 +570,14 @@ bool Engine::selectFormat() sampleRatesList += m_audioOutputDevice.supportedSampleRates(); sampleRatesList = sampleRatesList.toSet().toList(); // remove duplicates - qSort(sampleRatesList); + std::sort(sampleRatesList.begin(), sampleRatesList.end()); ENGINE_DEBUG << "Engine::initialize frequenciesList" << sampleRatesList; QList<int> channelsList; channelsList += m_audioInputDevice.supportedChannelCounts(); channelsList += m_audioOutputDevice.supportedChannelCounts(); channelsList = channelsList.toSet().toList(); - qSort(channelsList); + std::sort(channelsList.begin(), channelsList.end()); ENGINE_DEBUG << "Engine::initialize channelsList" << channelsList; QAudioFormat format; @@ -585,12 +585,11 @@ bool Engine::selectFormat() format.setCodec("audio/pcm"); format.setSampleSize(16); format.setSampleType(QAudioFormat::SignedInt); - int sampleRate, channels; - foreach (sampleRate, sampleRatesList) { + for (int sampleRate : qAsConst(sampleRatesList)) { if (foundSupportedFormat) break; format.setSampleRate(sampleRate); - foreach (channels, channelsList) { + for (int channels : qAsConst(channelsList)) { format.setChannelCount(channels); const bool inputSupport = m_generateTone || m_audioInputDevice.isFormatSupported(format); @@ -752,8 +751,7 @@ void Engine::createOutputDir() // Ensure output directory exists and is empty if (m_outputDir.exists()) { const QStringList files = m_outputDir.entryList(QDir::Files); - QString file; - foreach (file, files) + for (const QString &file : files) m_outputDir.remove(file); } else { QDir::current().mkdir("output"); diff --git a/examples/multimedia/spectrum/app/levelmeter.h b/examples/multimedia/spectrum/app/levelmeter.h index 860e07ffc..987f90e8f 100644 --- a/examples/multimedia/spectrum/app/levelmeter.h +++ b/examples/multimedia/spectrum/app/levelmeter.h @@ -51,7 +51,7 @@ #ifndef LEVELMETER_H #define LEVELMETER_H -#include <QTime> +#include <QElapsedTimer> #include <QWidget> /** @@ -99,7 +99,7 @@ private: /** * Time at which m_peakLevel was last changed. */ - QTime m_peakLevelChanged; + QElapsedTimer m_peakLevelChanged; /** * Rate at which peak level bar decays. @@ -116,7 +116,7 @@ private: /** * Time at which m_peakHoldLevel was last changed. */ - QTime m_peakHoldLevelChanged; + QElapsedTimer m_peakHoldLevelChanged; QTimer *m_redrawTimer; diff --git a/examples/multimedia/spectrum/app/mainwidget.cpp b/examples/multimedia/spectrum/app/mainwidget.cpp index 945313f32..235608a05 100644 --- a/examples/multimedia/spectrum/app/mainwidget.cpp +++ b/examples/multimedia/spectrum/app/mainwidget.cpp @@ -265,7 +265,7 @@ void MainWidget::createUi() QScopedPointer<QHBoxLayout> waveformLayout(new QHBoxLayout); waveformLayout->addWidget(m_progressBar); m_progressBar->setMinimumHeight(m_waveform->minimumHeight()); - waveformLayout->setMargin(0); + waveformLayout->setContentsMargins(0, 0, 0, 0); m_waveform->setLayout(waveformLayout.data()); waveformLayout.take(); windowLayout->addWidget(m_waveform); diff --git a/examples/multimedia/spectrum/app/settingsdialog.cpp b/examples/multimedia/spectrum/app/settingsdialog.cpp index f1723077e..889fcf639 100644 --- a/examples/multimedia/spectrum/app/settingsdialog.cpp +++ b/examples/multimedia/spectrum/app/settingsdialog.cpp @@ -72,11 +72,10 @@ SettingsDialog::SettingsDialog( // Populate combo boxes - QAudioDeviceInfo device; - foreach (device, availableInputDevices) + for (const QAudioDeviceInfo &device : availableInputDevices) m_inputDeviceComboBox->addItem(device.deviceName(), QVariant::fromValue(device)); - foreach (device, availableOutputDevices) + for (const QAudioDeviceInfo &device : availableOutputDevices) m_outputDeviceComboBox->addItem(device.deviceName(), QVariant::fromValue(device)); diff --git a/examples/multimedia/spectrum/app/waveform.cpp b/examples/multimedia/spectrum/app/waveform.cpp index 33e0297bc..d0058b2e3 100644 --- a/examples/multimedia/spectrum/app/waveform.cpp +++ b/examples/multimedia/spectrum/app/waveform.cpp @@ -243,10 +243,7 @@ void Waveform::audioPositionChanged(qint64 position) void Waveform::deletePixmaps() { - QPixmap *pixmap; - foreach (pixmap, m_pixmaps) - delete pixmap; - m_pixmaps.clear(); + qDeleteAll(qExchange(m_pixmaps, {})); } void Waveform::createPixmaps(const QSize &widgetSize) diff --git a/examples/multimedia/video/android/android.pro b/examples/multimedia/video/android/android.pro new file mode 100644 index 000000000..95ed21e17 --- /dev/null +++ b/examples/multimedia/video/android/android.pro @@ -0,0 +1,5 @@ +TEMPLATE = subdirs + +QT_FOR_CONFIG += multimedia-private + +qtConfig(gstreamer): SUBDIRS += gstreamer diff --git a/examples/multimedia/video/android/gstreamer/gstreamer.pro b/examples/multimedia/video/android/gstreamer/gstreamer.pro new file mode 100644 index 000000000..edc040adc --- /dev/null +++ b/examples/multimedia/video/android/gstreamer/gstreamer.pro @@ -0,0 +1,23 @@ +QT += quick multimedia multimediawidgets +CONFIG += c++11 + +SOURCES += main.cpp + +RESOURCES += qml.qrc + +target.path = $$[QT_INSTALL_EXAMPLES]/multimedia/video/android/gstreamer +INSTALLS += target + +GSTREAMER_ROOT_ANDROID = $$(GSTREAMER_ROOT_ANDROID) +isEmpty(GSTREAMER_ROOT_ANDROID): error("GSTREAMER_ROOT_ANDROID is empty") + +INCLUDEPATH += $(GSTREAMER_ROOT_ANDROID)/armv7/include/ $(GSTREAMER_ROOT_ANDROID)/armv7/include/gstreamer-1.0 $(GSTREAMER_ROOT_ANDROID)/armv7/include/glib-2.0 $(GSTREAMER_ROOT_ANDROID)/armv7/lib/glib-2.0/include + +QT+=multimediagsttools-private +LIBS += -L$(GSTREAMER_ROOT_ANDROID)/armv7/lib/ -L$(GSTREAMER_ROOT_ANDROID)/armv7/lib/gstreamer-1.0 \ +-lgstcoreelements -lgstplayback -lgstvideotestsrc -lgstaudioconvert -lgstvideoconvert -lgstautodetect -lgsttypefindfunctions \ +#PLUGINS codecs +-lgstvorbis -lvorbis -lgstivorbisdec -lvorbisenc -lvorbisfile -lgstsubparse -lgstaudioparsers \ +-lgstgio -lgstapp -lgstisomp4 -lgstavi -lgstogg -lgstwavenc -lgstwavpack -lgstwavparse -lgsttheora -lgstmpg123 -lgstx264 -lgstlibav \ +-lgsttcp -lgstsoup -logg -ltheora -lmpg123 -lx264 -lavfilter -lavformat -lavcodec -lavutil -lbz2 -lswresample \ +-lsoup-2.4 -lgio-2.0 -lgstrtp-1.0 -lgstriff-1.0 -lgstnet-1.0 diff --git a/examples/multimedia/video/android/gstreamer/main.cpp b/examples/multimedia/video/android/gstreamer/main.cpp new file mode 100644 index 000000000..56037aece --- /dev/null +++ b/examples/multimedia/video/android/gstreamer/main.cpp @@ -0,0 +1,115 @@ +/**************************************************************************** +** +** Copyright (C) 2019 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QGuiApplication> +#include <QQmlApplicationEngine> + +#include <private/qgstutils_p.h> + +#include <gst/gstplugin.h> +extern "C" { +GST_PLUGIN_STATIC_DECLARE(coreelements); +GST_PLUGIN_STATIC_DECLARE(playback); +GST_PLUGIN_STATIC_DECLARE(videotestsrc); +GST_PLUGIN_STATIC_DECLARE(audioconvert); +GST_PLUGIN_STATIC_DECLARE(videoconvert); +GST_PLUGIN_STATIC_DECLARE(autodetect); +GST_PLUGIN_STATIC_DECLARE(gio); +GST_PLUGIN_STATIC_DECLARE(soup); +GST_PLUGIN_STATIC_DECLARE(app); +GST_PLUGIN_STATIC_DECLARE(isomp4); +GST_PLUGIN_STATIC_DECLARE(avi); +GST_PLUGIN_STATIC_DECLARE(ogg); +GST_PLUGIN_STATIC_DECLARE(vorbis); +GST_PLUGIN_STATIC_DECLARE(tcp); +GST_PLUGIN_STATIC_DECLARE(audioparsers); +GST_PLUGIN_STATIC_DECLARE(theora); +GST_PLUGIN_STATIC_DECLARE(mpg123); +GST_PLUGIN_STATIC_DECLARE(typefindfunctions); +GST_PLUGIN_STATIC_DECLARE(x264); +GST_PLUGIN_STATIC_DECLARE(libav); +}; + +int main(int argc, char *argv[]) +{ + QGstUtils::initializeGst(); + + GST_PLUGIN_STATIC_REGISTER(coreelements); + GST_PLUGIN_STATIC_REGISTER(playback); + GST_PLUGIN_STATIC_REGISTER(videotestsrc); + GST_PLUGIN_STATIC_REGISTER(audioconvert); + GST_PLUGIN_STATIC_REGISTER(videoconvert); + GST_PLUGIN_STATIC_REGISTER(autodetect); + GST_PLUGIN_STATIC_REGISTER(soup); + GST_PLUGIN_STATIC_REGISTER(gio); + GST_PLUGIN_STATIC_REGISTER(app); + GST_PLUGIN_STATIC_REGISTER(isomp4); + GST_PLUGIN_STATIC_REGISTER(avi); + GST_PLUGIN_STATIC_REGISTER(ogg); + GST_PLUGIN_STATIC_REGISTER(vorbis); + GST_PLUGIN_STATIC_REGISTER(tcp); + GST_PLUGIN_STATIC_REGISTER(audioparsers); + GST_PLUGIN_STATIC_REGISTER(theora); + GST_PLUGIN_STATIC_REGISTER(mpg123); + GST_PLUGIN_STATIC_REGISTER(typefindfunctions); + GST_PLUGIN_STATIC_REGISTER(x264); + GST_PLUGIN_STATIC_REGISTER(libav); + + QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); + + QGuiApplication app(argc, argv); + + QQmlApplicationEngine engine; + engine.load(QUrl(QLatin1String("qrc:/main.qml"))); + if (engine.rootObjects().isEmpty()) + return -1; + + return app.exec(); +} diff --git a/examples/multimedia/video/android/gstreamer/main.qml b/examples/multimedia/video/android/gstreamer/main.qml new file mode 100644 index 000000000..99acb558c --- /dev/null +++ b/examples/multimedia/video/android/gstreamer/main.qml @@ -0,0 +1,75 @@ +/**************************************************************************** +** +** Copyright (C) 2019 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.7 +import QtQuick.Controls 2.0 +import QtQuick.Layouts 1.3 +import QtMultimedia 5.12 + +ApplicationWindow { + visible: true + width: 640 + height: 480 + + Video { + id: video + anchors.fill: parent + autoPlay: true + autoLoad: true + source: "gst-pipeline: videotestsrc ! qtvideosink" + } + + MouseArea { + anchors.fill: video + onClicked: { + video.play() + } + } +} diff --git a/examples/multimedia/video/android/gstreamer/qml.qrc b/examples/multimedia/video/android/gstreamer/qml.qrc new file mode 100644 index 000000000..5f6483ac3 --- /dev/null +++ b/examples/multimedia/video/android/gstreamer/qml.qrc @@ -0,0 +1,5 @@ +<RCC> + <qresource prefix="/"> + <file>main.qml</file> + </qresource> +</RCC> diff --git a/examples/multimedia/video/video.pro b/examples/multimedia/video/video.pro index f38cbc124..ef5bc849d 100644 --- a/examples/multimedia/video/video.pro +++ b/examples/multimedia/video/video.pro @@ -5,3 +5,5 @@ SUBDIRS += qmlvideo qmlvideofx EXAMPLE_FILES += \ qmlvideofilter_opencl \ # FIXME: this one should use a configure check instead snippets + +android: SUBDIRS += android diff --git a/examples/multimediawidgets/customvideosurface/customvideoitem/videoplayer.cpp b/examples/multimediawidgets/customvideosurface/customvideoitem/videoplayer.cpp index 60b93a116..1fdd1c7f7 100644 --- a/examples/multimediawidgets/customvideosurface/customvideoitem/videoplayer.cpp +++ b/examples/multimediawidgets/customvideosurface/customvideoitem/videoplayer.cpp @@ -101,7 +101,7 @@ VideoPlayer::VideoPlayer(QWidget *parent) this, &VideoPlayer::setPosition); QBoxLayout *controlLayout = new QHBoxLayout; - controlLayout->setMargin(0); + controlLayout->setContentsMargins(0, 0, 0, 0); controlLayout->addWidget(openButton); controlLayout->addWidget(playButton); controlLayout->addWidget(positionSlider); diff --git a/examples/multimediawidgets/customvideosurface/customvideowidget/videoplayer.cpp b/examples/multimediawidgets/customvideosurface/customvideowidget/videoplayer.cpp index 7730f8140..5c1ca4221 100644 --- a/examples/multimediawidgets/customvideosurface/customvideowidget/videoplayer.cpp +++ b/examples/multimediawidgets/customvideosurface/customvideowidget/videoplayer.cpp @@ -81,7 +81,7 @@ VideoPlayer::VideoPlayer(QWidget *parent) this, &VideoPlayer::setPosition); QBoxLayout *controlLayout = new QHBoxLayout; - controlLayout->setMargin(0); + controlLayout->setContentsMargins(0, 0, 0, 0); controlLayout->addWidget(openButton); controlLayout->addWidget(playButton); controlLayout->addWidget(positionSlider); diff --git a/examples/multimediawidgets/player/player.cpp b/examples/multimediawidgets/player/player.cpp index 89246e65c..04da42587 100644 --- a/examples/multimediawidgets/player/player.cpp +++ b/examples/multimediawidgets/player/player.cpp @@ -158,7 +158,7 @@ Player::Player(QWidget *parent) displayLayout->addWidget(m_playlistView); QBoxLayout *controlLayout = new QHBoxLayout; - controlLayout->setMargin(0); + controlLayout->setContentsMargins(0, 0, 0, 0); controlLayout->addWidget(openButton); controlLayout->addStretch(1); controlLayout->addWidget(controls); diff --git a/examples/multimediawidgets/player/playercontrols.cpp b/examples/multimediawidgets/player/playercontrols.cpp index 2a1869b93..3c06c01c6 100644 --- a/examples/multimediawidgets/player/playercontrols.cpp +++ b/examples/multimediawidgets/player/playercontrols.cpp @@ -100,7 +100,7 @@ PlayerControls::PlayerControls(QWidget *parent) connect(m_rateBox, QOverload<int>::of(&QComboBox::activated), this, &PlayerControls::updateRate); QBoxLayout *layout = new QHBoxLayout; - layout->setMargin(0); + layout->setContentsMargins(0, 0, 0, 0); layout->addWidget(m_stopButton); layout->addWidget(m_previousButton); layout->addWidget(m_playButton); diff --git a/examples/multimediawidgets/player/playlistmodel.cpp b/examples/multimediawidgets/player/playlistmodel.cpp index e5246bc37..718c24d2d 100644 --- a/examples/multimediawidgets/player/playlistmodel.cpp +++ b/examples/multimediawidgets/player/playlistmodel.cpp @@ -94,7 +94,7 @@ QVariant PlaylistModel::data(const QModelIndex &index, int role) const if (index.isValid() && role == Qt::DisplayRole) { QVariant value = m_data[index]; if (!value.isValid() && index.column() == Title) { - QUrl location = m_playlist->media(index.row()).canonicalUrl(); + QUrl location = m_playlist->media(index.row()).request().url(); return QFileInfo(location.path()).fileName(); } diff --git a/examples/multimediawidgets/videographicsitem/videoplayer.cpp b/examples/multimediawidgets/videographicsitem/videoplayer.cpp index 995c86d3e..39c113fe5 100644 --- a/examples/multimediawidgets/videographicsitem/videoplayer.cpp +++ b/examples/multimediawidgets/videographicsitem/videoplayer.cpp @@ -90,7 +90,7 @@ VideoPlayer::VideoPlayer(QWidget *parent) this, &VideoPlayer::setPosition); QBoxLayout *controlLayout = new QHBoxLayout; - controlLayout->setMargin(0); + controlLayout->setContentsMargins(0, 0, 0, 0); controlLayout->addWidget(openButton); controlLayout->addWidget(m_playButton); controlLayout->addWidget(m_positionSlider); diff --git a/examples/multimediawidgets/videowidget/videoplayer.cpp b/examples/multimediawidgets/videowidget/videoplayer.cpp index e7ad670fa..1db269503 100644 --- a/examples/multimediawidgets/videowidget/videoplayer.cpp +++ b/examples/multimediawidgets/videowidget/videoplayer.cpp @@ -79,7 +79,7 @@ VideoPlayer::VideoPlayer(QWidget *parent) m_errorLabel->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum); QBoxLayout *controlLayout = new QHBoxLayout; - controlLayout->setMargin(0); + controlLayout->setContentsMargins(0, 0, 0, 0); controlLayout->addWidget(openButton); controlLayout->addWidget(m_playButton); controlLayout->addWidget(m_positionSlider); diff --git a/src/gsttools/gsttools.pro b/src/gsttools/gsttools.pro index b13479ce7..0127cbe92 100644 --- a/src/gsttools/gsttools.pro +++ b/src/gsttools/gsttools.pro @@ -82,14 +82,7 @@ qtConfig(gstreamer_0_10) { qgstvideorenderersink.cpp } -qtConfig(mirclient): { - qtConfig(opengles2):qtHaveModule(widgets) { - PRIVATE_HEADERS += qgstreamermirtexturerenderer_p.h - SOURCES += qgstreamermirtexturerenderer.cpp - QT += opengl quick - LIBS += -lEGL - } -} +qtConfig(gstreamer_gl): QMAKE_USE += gstreamer_gl qtConfig(gstreamer_app) { QMAKE_USE += gstreamer_app @@ -97,6 +90,15 @@ qtConfig(gstreamer_app) { SOURCES += qgstappsrc.cpp } +android { + LIBS_PRIVATE += \ + -L$$(GSTREAMER_ROOT_ANDROID)/armv7/lib \ + -Wl,--whole-archive \ + -lgstapp-1.0 -lgstreamer-1.0 -lgstaudio-1.0 -lgsttag-1.0 -lgstvideo-1.0 -lgstbase-1.0 -lgstpbutils-1.0 \ + -lgobject-2.0 -lgmodule-2.0 -lglib-2.0 -lffi -lintl -liconv -lorc-0.4 \ + -Wl,--no-whole-archive +} + HEADERS += $$PRIVATE_HEADERS load(qt_module) diff --git a/src/gsttools/qgstappsrc.cpp b/src/gsttools/qgstappsrc.cpp index 3e8b8b9b3..d5c44ec08 100644 --- a/src/gsttools/qgstappsrc.cpp +++ b/src/gsttools/qgstappsrc.cpp @@ -187,10 +187,10 @@ void QGstAppSrc::pushDataToAppSrc() } #endif } - } else { + } else if (!m_sequential) { sendEOS(); } - } else if (m_stream->atEnd()) { + } else if (m_stream->atEnd() && !m_sequential) { sendEOS(); } } diff --git a/src/gsttools/qgstreamermirtexturerenderer.cpp b/src/gsttools/qgstreamermirtexturerenderer.cpp deleted file mode 100644 index 35050db03..000000000 --- a/src/gsttools/qgstreamermirtexturerenderer.cpp +++ /dev/null @@ -1,357 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 Canonical Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qgstreamermirtexturerenderer_p.h" - -#include <qgstreamerplayersession.h> -#include <private/qvideosurfacegstsink_p.h> -#include <private/qgstutils_p.h> -#include <qabstractvideosurface.h> - -#include <QAbstractVideoBuffer> -#include <QGuiApplication> -#include <QDebug> -#include <QtQuick/QQuickWindow> -#include <QOpenGLContext> -#include <QGLContext> -#include <QGuiApplication> -#include <qgl.h> - -#include <gst/gst.h> - -static QGstreamerMirTextureRenderer *rendererInstance = NULL; - -class QGstreamerMirTextureBuffer : public QAbstractVideoBuffer -{ -public: - QGstreamerMirTextureBuffer(GLuint textureId) : - QAbstractVideoBuffer(QAbstractVideoBuffer::GLTextureHandle), - m_textureId(textureId) - { - } - - MapMode mapMode() const { return NotMapped; } - - uchar *map(MapMode mode, int *numBytes, int *bytesPerLine) - { - qDebug() << Q_FUNC_INFO; - Q_UNUSED(mode); - Q_UNUSED(numBytes); - Q_UNUSED(bytesPerLine); - - return NULL; - } - - void unmap() { qDebug() << Q_FUNC_INFO; } - - QVariant handle() const { return QVariant::fromValue<unsigned int>(m_textureId); } - - GLuint textureId() { return m_textureId; } - -private: - GLuint m_textureId; -}; - -QGstreamerMirTextureRenderer::QGstreamerMirTextureRenderer(QObject *parent - , const QGstreamerPlayerSession *playerSession) - : QVideoRendererControl(0), m_videoSink(0), m_surface(0), - m_glSurface(0), - m_context(0), - m_glContext(0), - m_textureId(0), - m_offscreenSurface(0), - m_textureBuffer(0) -{ - Q_UNUSED(parent); - setPlayerSession(playerSession); -} - -QGstreamerMirTextureRenderer::~QGstreamerMirTextureRenderer() -{ - if (m_videoSink) - gst_object_unref(GST_OBJECT(m_videoSink)); - - delete m_glContext; - delete m_offscreenSurface; -} - -GstElement *QGstreamerMirTextureRenderer::videoSink() -{ - qDebug() << Q_FUNC_INFO; - - // FIXME: Ugly hack until I figure out why passing this segfaults in the g_signal handler - rendererInstance = const_cast<QGstreamerMirTextureRenderer*>(this); - - if (!m_videoSink && m_surface) { - qDebug() << Q_FUNC_INFO << ": using mirsink, (this: " << this << ")"; - - m_videoSink = gst_element_factory_make("mirsink", "video-output"); - - connect(QGuiApplication::instance(), SIGNAL(focusWindowChanged(QWindow*)), - this, SLOT(handleFocusWindowChanged(QWindow*)), Qt::QueuedConnection); - - g_signal_connect(G_OBJECT(m_videoSink), "frame-ready", G_CALLBACK(handleFrameReady), - (gpointer)this); - } - - if (m_videoSink) { - gst_object_ref_sink(GST_OBJECT(m_videoSink)); - - GstPad *pad = gst_element_get_static_pad(m_videoSink, "sink"); - gst_pad_add_probe(pad, GST_PAD_PROBE_TYPE_BUFFER, - padBufferProbe, this, NULL); - } - - return m_videoSink; -} - -QWindow *QGstreamerMirTextureRenderer::createOffscreenWindow(const QSurfaceFormat &format) -{ - QWindow *w = new QWindow(); - w->setSurfaceType(QWindow::OpenGLSurface); - w->setFormat(format); - w->setGeometry(0, 0, 1, 1); - w->setFlags(w->flags() | Qt::WindowTransparentForInput); - w->create(); - - return w; -} - -void QGstreamerMirTextureRenderer::handleFrameReady(gpointer userData) -{ - QGstreamerMirTextureRenderer *renderer = reinterpret_cast<QGstreamerMirTextureRenderer*>(userData); -#if 1 - QMutexLocker locker(&rendererInstance->m_mutex); - QMetaObject::invokeMethod(rendererInstance, "renderFrame", Qt::QueuedConnection); -#else - // FIXME! - //QMutexLocker locker(&renderer->m_mutex); - QMetaObject::invokeMethod(renderer, "renderFrame", Qt::QueuedConnection); -#endif -} - -void QGstreamerMirTextureRenderer::renderFrame() -{ - //qDebug() << Q_FUNC_INFO; - - if (m_context) - m_context->makeCurrent(); - - GstState pendingState = GST_STATE_NULL; - GstState newState = GST_STATE_NULL; - // Don't block and return immediately: - GstStateChangeReturn ret = gst_element_get_state(m_videoSink, &newState, - &pendingState, 0); - if (ret == GST_STATE_CHANGE_FAILURE || newState == GST_STATE_NULL|| - pendingState == GST_STATE_NULL) { - qWarning() << "Invalid state change for renderer, aborting"; - stopRenderer(); - return; - } - - if (!m_surface->isActive()) { - qDebug() << "m_surface is not active"; - GstPad *pad = gst_element_get_static_pad(m_videoSink, "sink"); - GstCaps *caps = gst_pad_get_current_caps(pad); - - if (caps) { - // Get the native video size from the video sink - QSize newNativeSize = QGstUtils::capsCorrectedResolution(caps); - if (m_nativeSize != newNativeSize) { - m_nativeSize = newNativeSize; - emit nativeSizeChanged(); - } - gst_caps_unref(caps); - } - - // Start the surface - QVideoSurfaceFormat format(m_nativeSize, QVideoFrame::Format_RGB32, QAbstractVideoBuffer::GLTextureHandle); - qDebug() << "m_nativeSize: " << m_nativeSize; - qDebug() << "format: " << format; - if (!m_surface->start(format)) { - qWarning() << Q_FUNC_INFO << ": failed to start the video surface " << format; - return; - } - } - - QGstreamerMirTextureBuffer *buffer = new QGstreamerMirTextureBuffer(m_textureId); - //qDebug() << "frameSize: " << m_surface->surfaceFormat().frameSize(); - QVideoFrame frame(buffer, m_surface->surfaceFormat().frameSize(), - m_surface->surfaceFormat().pixelFormat()); - - frame.setMetaData("TextureId", m_textureId); - - // Display the video frame on the surface: - m_surface->present(frame); -} - -GstPadProbeReturn QGstreamerMirTextureRenderer::padBufferProbe(GstPad *pad, GstPadProbeInfo *info, gpointer userData) -{ - Q_UNUSED(pad); - Q_UNUSED(info); - - QGstreamerMirTextureRenderer *control = reinterpret_cast<QGstreamerMirTextureRenderer*>(userData); - QMetaObject::invokeMethod(control, "updateNativeVideoSize", Qt::QueuedConnection); - - return GST_PAD_PROBE_REMOVE; -} - -void QGstreamerMirTextureRenderer::stopRenderer() -{ - if (m_surface) - m_surface->stop(); -} - -QAbstractVideoSurface *QGstreamerMirTextureRenderer::surface() const -{ - return m_surface; -} - -void QGstreamerMirTextureRenderer::setSurface(QAbstractVideoSurface *surface) -{ - qDebug() << Q_FUNC_INFO; - - if (m_surface != surface) { - qDebug() << "Saving current QGLContext"; - m_context = const_cast<QGLContext*>(QGLContext::currentContext()); - - if (m_videoSink) - gst_object_unref(GST_OBJECT(m_videoSink)); - - m_videoSink = 0; - - if (m_surface) { - disconnect(m_surface.data(), SIGNAL(supportedFormatsChanged()), - this, SLOT(handleFormatChange())); - } - - bool wasReady = isReady(); - - m_surface = surface; - - if (m_surface) { - connect(m_surface.data(), SIGNAL(supportedFormatsChanged()), - this, SLOT(handleFormatChange())); - } - - if (wasReady != isReady()) - emit readyChanged(isReady()); - - emit sinkChanged(); - } -} - -void QGstreamerMirTextureRenderer::setPlayerSession(const QGstreamerPlayerSession *playerSession) -{ - m_playerSession = const_cast<QGstreamerPlayerSession*>(playerSession); -} - -void QGstreamerMirTextureRenderer::handleFormatChange() -{ - qDebug() << "Supported formats list has changed, reload video output"; - - if (m_videoSink) - gst_object_unref(GST_OBJECT(m_videoSink)); - - m_videoSink = 0; - emit sinkChanged(); -} - -void QGstreamerMirTextureRenderer::updateNativeVideoSize() -{ - //qDebug() << Q_FUNC_INFO; - const QSize oldSize = m_nativeSize; - - if (m_videoSink) { - // Find video native size to update video widget size hint - GstPad *pad = gst_element_get_static_pad(m_videoSink,"sink"); - GstCaps *caps = gst_pad_get_current_caps(pad); - - if (caps) { - m_nativeSize = QGstUtils::capsCorrectedResolution(caps); - gst_caps_unref(caps); - } - } else { - m_nativeSize = QSize(); - } - qDebug() << Q_FUNC_INFO << oldSize << m_nativeSize << m_videoSink; - - if (m_nativeSize != oldSize) - emit nativeSizeChanged(); -} - -void QGstreamerMirTextureRenderer::handleFocusWindowChanged(QWindow *window) -{ - qDebug() << Q_FUNC_INFO; - - QOpenGLContext *currContext = QOpenGLContext::currentContext(); - - QQuickWindow *w = dynamic_cast<QQuickWindow*>(window); - // If we don't have a GL context in the current thread, create one and share it - // with the render thread GL context - if (!currContext && !m_glContext) { - // This emulates the new QOffscreenWindow class with Qt5.1 - m_offscreenSurface = createOffscreenWindow(w->openglContext()->surface()->format()); - m_offscreenSurface->setParent(window); - - QOpenGLContext *shareContext = 0; - if (m_surface) - shareContext = qobject_cast<QOpenGLContext*>(m_surface->property("GLContext").value<QObject*>()); - m_glContext = new QOpenGLContext; - m_glContext->setFormat(m_offscreenSurface->requestedFormat()); - - if (shareContext) - m_glContext->setShareContext(shareContext); - - if (!m_glContext->create()) - { - qWarning() << "Failed to create new shared context."; - return; - } - } - - if (m_glContext) - m_glContext->makeCurrent(m_offscreenSurface); - - if (m_textureId == 0) { - glGenTextures(1, &m_textureId); - qDebug() << "texture_id (handleFocusWindowChanged): " << m_textureId << endl; - g_object_set(G_OBJECT(m_videoSink), "texture-id", m_textureId, (char*)NULL); - } -} diff --git a/src/gsttools/qgstreamermirtexturerenderer_p.h b/src/gsttools/qgstreamermirtexturerenderer_p.h deleted file mode 100644 index 62150f7e1..000000000 --- a/src/gsttools/qgstreamermirtexturerenderer_p.h +++ /dev/null @@ -1,119 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 Canonical Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QGSTREAMERMIRTEXTURERENDERER_H -#define QGSTREAMERMIRTEXTURERENDERER_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#include <qmediaplayer.h> -#include <qvideorenderercontrol.h> -#include <private/qvideosurfacegstsink_p.h> -#include <qabstractvideosurface.h> - -#include "qgstreamervideorendererinterface_p.h" - -QT_BEGIN_NAMESPACE - -class QGstreamerMirTextureBuffer; -class QGstreamerPlayerSession; -class QGLContext; -class QOpenGLContext; -class QSurfaceFormat; - -class QGstreamerMirTextureRenderer : public QVideoRendererControl, public QGstreamerVideoRendererInterface -{ - Q_OBJECT - Q_INTERFACES(QGstreamerVideoRendererInterface) -public: - QGstreamerMirTextureRenderer(QObject *parent = 0, const QGstreamerPlayerSession *playerSession = 0); - virtual ~QGstreamerMirTextureRenderer(); - - QAbstractVideoSurface *surface() const; - void setSurface(QAbstractVideoSurface *surface); - - void setPlayerSession(const QGstreamerPlayerSession *playerSession); - - GstElement *videoSink(); - - void stopRenderer(); - bool isReady() const { return m_surface != 0; } - -signals: - void sinkChanged(); - void readyChanged(bool); - void nativeSizeChanged(); - -private slots: - void handleFormatChange(); - void updateNativeVideoSize(); - void handleFocusWindowChanged(QWindow *window); - void renderFrame(); - -private: - QWindow *createOffscreenWindow(const QSurfaceFormat &format); - static void handleFrameReady(gpointer userData); - static GstPadProbeReturn padBufferProbe(GstPad *pad, GstPadProbeInfo *info, gpointer userData); - - GstElement *m_videoSink; - QPointer<QAbstractVideoSurface> m_surface; - QPointer<QAbstractVideoSurface> m_glSurface; - QGLContext *m_context; - QOpenGLContext *m_glContext; - unsigned int m_textureId; - QWindow *m_offscreenSurface; - QGstreamerPlayerSession *m_playerSession; - QGstreamerMirTextureBuffer *m_textureBuffer; - QSize m_nativeSize; - - QMutex m_mutex; -}; - -QT_END_NAMESPACE - -#endif // QGSTREAMERMIRTEXTURERENDRER_H diff --git a/src/gsttools/qgstreamerplayercontrol.cpp b/src/gsttools/qgstreamerplayercontrol.cpp index 7c96b682f..bd4c90ac5 100644 --- a/src/gsttools/qgstreamerplayercontrol.cpp +++ b/src/gsttools/qgstreamerplayercontrol.cpp @@ -362,14 +362,10 @@ void QGstreamerPlayerControl::setMedia(const QMediaContent &content, QIODevice * m_currentResource = content; m_stream = stream; - QNetworkRequest request; + QNetworkRequest request = content.request(); - if (m_stream) { + if (m_stream) userStreamValid = stream->isOpen() && m_stream->isReadable(); - request = content.canonicalRequest(); - } else if (!content.isNull()) { - request = content.canonicalRequest(); - } #if !QT_CONFIG(gstreamer_app) m_session->loadFromUri(request); diff --git a/src/gsttools/qgstreamerplayersession.cpp b/src/gsttools/qgstreamerplayersession.cpp index c0998d7ae..b9e1c084f 100644 --- a/src/gsttools/qgstreamerplayersession.cpp +++ b/src/gsttools/qgstreamerplayersession.cpp @@ -179,13 +179,26 @@ void QGstreamerPlayerSession::initPlaybin() m_videoOutputBin = gst_bin_new("video-output-bin"); // might not get a parent, take ownership to avoid leak qt_gst_object_ref_sink(GST_OBJECT(m_videoOutputBin)); + + GstElement *videoOutputSink = m_videoIdentity; +#if QT_CONFIG(gstreamer_gl) + if (QGstUtils::useOpenGL()) { + videoOutputSink = gst_element_factory_make("glupload", NULL); + GstElement *colorConvert = gst_element_factory_make("glcolorconvert", NULL); + gst_bin_add_many(GST_BIN(m_videoOutputBin), videoOutputSink, colorConvert, m_videoIdentity, m_nullVideoSink, NULL); + gst_element_link_many(videoOutputSink, colorConvert, m_videoIdentity, NULL); + } else { + gst_bin_add_many(GST_BIN(m_videoOutputBin), m_videoIdentity, m_nullVideoSink, NULL); + } +#else gst_bin_add_many(GST_BIN(m_videoOutputBin), m_videoIdentity, m_nullVideoSink, NULL); +#endif gst_element_link(m_videoIdentity, m_nullVideoSink); m_videoSink = m_nullVideoSink; // add ghostpads - GstPad *pad = gst_element_get_static_pad(m_videoIdentity,"sink"); + GstPad *pad = gst_element_get_static_pad(videoOutputSink, "sink"); gst_element_add_pad(GST_ELEMENT(m_videoOutputBin), gst_ghost_pad_new("sink", pad)); gst_object_unref(GST_OBJECT(pad)); diff --git a/src/gsttools/qgstreamervideooverlay.cpp b/src/gsttools/qgstreamervideooverlay.cpp index 1f3e28549..6b862e475 100644 --- a/src/gsttools/qgstreamervideooverlay.cpp +++ b/src/gsttools/qgstreamervideooverlay.cpp @@ -48,6 +48,8 @@ #include <gst/video/videooverlay.h> #endif +#include <QtMultimedia/private/qtmultimediaglobal_p.h> + QT_BEGIN_NAMESPACE struct ElementMap @@ -59,6 +61,9 @@ struct ElementMap // Ordered by descending priority static const ElementMap elementMap[] = { +#if QT_CONFIG(gstreamer_gl) + { "xcb", "glimagesink" }, +#endif { "xcb", "vaapisink" }, { "xcb", "xvimagesink" }, { "xcb", "ximagesink" } @@ -340,6 +345,10 @@ static GstElement *findBestVideoSink() // First, try some known video sinks, depending on the Qt platform plugin in use. for (quint32 i = 0; i < (sizeof(elementMap) / sizeof(ElementMap)); ++i) { +#if QT_CONFIG(gstreamer_gl) + if (!QGstUtils::useOpenGL() && qstrcmp(elementMap[i].gstreamerElement, "glimagesink") == 0) + continue; +#endif if (platform == QLatin1String(elementMap[i].qtPlatform) && (choice = gst_element_factory_make(elementMap[i].gstreamerElement, NULL))) { diff --git a/src/gsttools/qgstreamervideowidget.cpp b/src/gsttools/qgstreamervideowidget.cpp index 46432a0a1..164e62f86 100644 --- a/src/gsttools/qgstreamervideowidget.cpp +++ b/src/gsttools/qgstreamervideowidget.cpp @@ -169,6 +169,8 @@ bool QGstreamerVideoWidgetControl::eventFilter(QObject *object, QEvent *e) } if (e->type() == QEvent::Paint) { + // Update overlay by new size if any. + m_videoOverlay.setRenderRectangle(QRect(0, 0, m_widget->width(), m_widget->height())); if (m_videoOverlay.isActive()) m_videoOverlay.expose(); // triggers a repaint of the last frame else diff --git a/src/gsttools/qgstutils.cpp b/src/gsttools/qgstutils.cpp index 48781b0c7..f8a9d79c1 100644 --- a/src/gsttools/qgstutils.cpp +++ b/src/gsttools/qgstutils.cpp @@ -1034,6 +1034,7 @@ struct VideoFormat static const VideoFormat qt_videoFormatLookup[] = { { QVideoFrame::Format_YUV420P, GST_VIDEO_FORMAT_I420 }, + { QVideoFrame::Format_YUV422P, GST_VIDEO_FORMAT_Y42B }, { QVideoFrame::Format_YV12 , GST_VIDEO_FORMAT_YV12 }, { QVideoFrame::Format_UYVY , GST_VIDEO_FORMAT_UYVY }, { QVideoFrame::Format_YUYV , GST_VIDEO_FORMAT_YUY2 }, @@ -1044,11 +1045,13 @@ static const VideoFormat qt_videoFormatLookup[] = { QVideoFrame::Format_RGB32 , GST_VIDEO_FORMAT_BGRx }, { QVideoFrame::Format_BGR32 , GST_VIDEO_FORMAT_RGBx }, { QVideoFrame::Format_ARGB32, GST_VIDEO_FORMAT_BGRA }, + { QVideoFrame::Format_ABGR32, GST_VIDEO_FORMAT_RGBA }, { QVideoFrame::Format_BGRA32, GST_VIDEO_FORMAT_ARGB }, #else { QVideoFrame::Format_RGB32 , GST_VIDEO_FORMAT_xRGB }, { QVideoFrame::Format_BGR32 , GST_VIDEO_FORMAT_xBGR }, { QVideoFrame::Format_ARGB32, GST_VIDEO_FORMAT_ARGB }, + { QVideoFrame::Format_ABGR32, GST_VIDEO_FORMAT_ABGR }, { QVideoFrame::Format_BGRA32, GST_VIDEO_FORMAT_BGRA }, #endif { QVideoFrame::Format_RGB24 , GST_VIDEO_FORMAT_RGB }, @@ -1086,6 +1089,7 @@ struct YuvFormat static const YuvFormat qt_yuvColorLookup[] = { { QVideoFrame::Format_YUV420P, GST_MAKE_FOURCC('I','4','2','0'), 8 }, + { QVideoFrame::Format_YUV422P, GST_MAKE_FOURCC('Y','4','2','B'), 8 }, { QVideoFrame::Format_YV12, GST_MAKE_FOURCC('Y','V','1','2'), 8 }, { QVideoFrame::Format_UYVY, GST_MAKE_FOURCC('U','Y','V','Y'), 16 }, { QVideoFrame::Format_YUYV, GST_MAKE_FOURCC('Y','U','Y','2'), 16 }, @@ -1303,11 +1307,9 @@ void QGstUtils::setMetaData(GstElement *element, const QMap<QByteArray, QVariant gst_tag_setter_reset_tags(GST_TAG_SETTER(element)); - QMapIterator<QByteArray, QVariant> it(data); - while (it.hasNext()) { - it.next(); + for (auto it = data.cbegin(), end = data.cend(); it != end; ++it) { const QString tagName = QString::fromLatin1(it.key()); - const QVariant tagValue = it.value(); + const QVariant &tagValue = it.value(); switch (tagValue.type()) { case QVariant::String: @@ -1566,6 +1568,12 @@ QVariant QGstUtils::toGStreamerOrientation(const QVariant &value) } #endif +bool QGstUtils::useOpenGL() +{ + static bool result = qEnvironmentVariableIntValue("QT_GSTREAMER_USE_OPENGL_PLUGIN"); + return result; +} + void qt_gst_object_ref_sink(gpointer object) { #if GST_CHECK_VERSION(0,10,24) diff --git a/src/gsttools/qgstutils_p.h b/src/gsttools/qgstutils_p.h index 387a2e27a..5a2feec17 100644 --- a/src/gsttools/qgstutils_p.h +++ b/src/gsttools/qgstutils_p.h @@ -153,6 +153,8 @@ namespace QGstUtils { Q_GSTTOOLS_EXPORT QVariant fromGStreamerOrientation(const QVariant &value); Q_GSTTOOLS_EXPORT QVariant toGStreamerOrientation(const QVariant &value); #endif + + Q_GSTTOOLS_EXPORT bool useOpenGL(); } Q_GSTTOOLS_EXPORT void qt_gst_object_ref_sink(gpointer object); diff --git a/src/gsttools/qgstvideorenderersink.cpp b/src/gsttools/qgstvideorenderersink.cpp index 119fc55a1..3b458a978 100644 --- a/src/gsttools/qgstvideorenderersink.cpp +++ b/src/gsttools/qgstvideorenderersink.cpp @@ -54,6 +54,25 @@ #include "qgstutils_p.h" +#if QT_CONFIG(gstreamer_gl) +#include <QOpenGLContext> +#include <QGuiApplication> +#include <QWindow> +#include <qpa/qplatformnativeinterface.h> + +#include <gst/gl/gstglconfig.h> + +#if GST_GL_HAVE_WINDOW_X11 +# include <gst/gl/x11/gstgldisplay_x11.h> +#endif +#if GST_GL_HAVE_PLATFORM_EGL +# include <gst/gl/egl/gstgldisplay_egl.h> +#endif +#if GST_CHECK_VERSION(1,11,1) && GST_GL_HAVE_WINDOW_WAYLAND +# include <gst/gl/wayland/gstgldisplay_wayland.h> +#endif +#endif // #if QT_CONFIG(gstreamer_gl) + //#define DEBUG_VIDEO_SURFACE_SINK QT_BEGIN_NAMESPACE @@ -68,13 +87,33 @@ QGstDefaultVideoRenderer::~QGstDefaultVideoRenderer() GstCaps *QGstDefaultVideoRenderer::getCaps(QAbstractVideoSurface *surface) { - return QGstUtils::capsForFormats(surface->supportedPixelFormats()); +#if QT_CONFIG(gstreamer_gl) + if (QGstUtils::useOpenGL()) { + m_handleType = QAbstractVideoBuffer::GLTextureHandle; + auto formats = surface->supportedPixelFormats(m_handleType); + // Even if the surface does not support gl textures, + // glupload will be added to the pipeline and GLMemory will be requested. + // This will lead to upload data to gl textures + // and download it when the buffer will be used within rendering. + if (formats.isEmpty()) { + m_handleType = QAbstractVideoBuffer::NoHandle; + formats = surface->supportedPixelFormats(m_handleType); + } + + GstCaps *caps = QGstUtils::capsForFormats(formats); + for (guint i = 0; i < gst_caps_get_size(caps); ++i) + gst_caps_set_features(caps, i, gst_caps_features_from_string("memory:GLMemory")); + + return caps; + } +#endif + return QGstUtils::capsForFormats(surface->supportedPixelFormats(QAbstractVideoBuffer::NoHandle)); } bool QGstDefaultVideoRenderer::start(QAbstractVideoSurface *surface, GstCaps *caps) { m_flushed = true; - m_format = QGstUtils::formatForCaps(caps, &m_videoInfo); + m_format = QGstUtils::formatForCaps(caps, &m_videoInfo, m_handleType); return m_format.isValid() && surface->start(m_format); } @@ -89,8 +128,21 @@ void QGstDefaultVideoRenderer::stop(QAbstractVideoSurface *surface) bool QGstDefaultVideoRenderer::present(QAbstractVideoSurface *surface, GstBuffer *buffer) { m_flushed = false; + + QGstVideoBuffer *videoBuffer = nullptr; +#if QT_CONFIG(gstreamer_gl) + if (m_format.handleType() == QAbstractVideoBuffer::GLTextureHandle) { + GstGLMemory *glmem = GST_GL_MEMORY_CAST(gst_buffer_peek_memory(buffer, 0)); + guint textureId = gst_gl_memory_get_texture_id(glmem); + videoBuffer = new QGstVideoBuffer(buffer, m_videoInfo, m_format.handleType(), textureId); + } +#endif + + if (!videoBuffer) + videoBuffer = new QGstVideoBuffer(buffer, m_videoInfo); + QVideoFrame frame( - new QGstVideoBuffer(buffer, m_videoInfo), + videoBuffer, m_format.frameSize(), m_format.pixelFormat()); QGstUtils::setFrameTimeStamps(&frame, buffer); @@ -136,6 +188,10 @@ QVideoSurfaceGstDelegate::~QVideoSurfaceGstDelegate() gst_caps_unref(m_surfaceCaps); if (m_startCaps) gst_caps_unref(m_startCaps); +#if QT_CONFIG(gstreamer_gl) + if (m_gstGLDisplayContext) + gst_object_unref(m_gstGLDisplayContext); +#endif } GstCaps *QVideoSurfaceGstDelegate::caps() @@ -245,6 +301,118 @@ GstFlowReturn QVideoSurfaceGstDelegate::render(GstBuffer *buffer) return m_renderReturn; } +#if QT_CONFIG(gstreamer_gl) +static GstGLContext *gstGLDisplayContext(QAbstractVideoSurface *surface) +{ + QOpenGLContext *glContext = qobject_cast<QOpenGLContext*>(surface->property("GLContext").value<QObject*>()); + // Context is not ready yet. + if (!glContext) + return nullptr; + + GstGLDisplay *display = nullptr; + const QString platform = QGuiApplication::platformName(); + const char *contextName = "eglcontext"; + GstGLPlatform glPlatform = GST_GL_PLATFORM_EGL; + QPlatformNativeInterface *pni = QGuiApplication::platformNativeInterface(); + +#if GST_GL_HAVE_WINDOW_X11 + if (platform == QLatin1String("xcb")) { + if (QOpenGLContext::openGLModuleType() == QOpenGLContext::LibGL) { + contextName = "glxcontext"; + glPlatform = GST_GL_PLATFORM_GLX; + } + + display = (GstGLDisplay *)gst_gl_display_x11_new_with_display( + (Display *)pni->nativeResourceForIntegration("display")); + } +#endif + +#if GST_GL_HAVE_PLATFORM_EGL + if (!display && platform == QLatin1String("eglfs")) { + display = (GstGLDisplay *)gst_gl_display_egl_new_with_egl_display( + pni->nativeResourceForIntegration("egldisplay")); + } +#endif + +#if GST_CHECK_VERSION(1,11,1) +#if GST_GL_HAVE_WINDOW_WAYLAND + if (!display && platform.startsWith(QLatin1String("wayland"))) { + const char *displayName = (platform == QLatin1String("wayland")) + ? "display" : "egldisplay"; + + display = (GstGLDisplay *)gst_gl_display_wayland_new_with_display( + (struct wl_display *)pni->nativeResourceForIntegration(displayName)); + } +#endif +#endif + + if (!display) { + qWarning() << "Could not create GstGLDisplay"; + return nullptr; + } + + void *nativeContext = pni->nativeResourceForContext(contextName, glContext); + if (!nativeContext) + qWarning() << "Could not find resource for" << contextName; + + GstGLContext *appContext = gst_gl_context_new_wrapped(display, (guintptr)nativeContext, glPlatform, GST_GL_API_ANY); + if (!appContext) + qWarning() << "Could not create wrappped context for platform:" << glPlatform; + + GstGLContext *displayContext = nullptr; + GError *error = NULL; + gst_gl_display_create_context(display, appContext, &displayContext, &error); + if (error) { + qWarning() << "Could not create display context:" << error->message; + g_clear_error(&error); + } + + if (appContext) + gst_object_unref(appContext); + + gst_object_unref(display); + + return displayContext; +} +#endif // #if QT_CONFIG(gstreamer_gl) + +bool QVideoSurfaceGstDelegate::query(GstQuery *query) +{ +#if QT_CONFIG(gstreamer_gl) + if (GST_QUERY_TYPE(query) == GST_QUERY_CONTEXT) { + const gchar *type; + gst_query_parse_context_type(query, &type); + + if (strcmp(type, "gst.gl.local_context") != 0) + return false; + + if (!m_gstGLDisplayContext) + m_gstGLDisplayContext = gstGLDisplayContext(m_surface); + + // No context yet. + if (!m_gstGLDisplayContext) + return false; + + GstContext *context = NULL; + gst_query_parse_context(query, &context); + context = context ? gst_context_copy(context) : gst_context_new(type, FALSE); + GstStructure *structure = gst_context_writable_structure(context); +#if GST_CHECK_VERSION(1,11,1) + gst_structure_set(structure, "context", GST_TYPE_GL_CONTEXT, m_gstGLDisplayContext, NULL); +#else + gst_structure_set(structure, "context", GST_GL_TYPE_CONTEXT, m_gstGLDisplayContext, NULL); +#endif + gst_query_set_context(query, context); + gst_context_unref(context); + + return m_gstGLDisplayContext; + } +#else + Q_UNUSED(query); +#endif + return false; +} + bool QVideoSurfaceGstDelegate::event(QEvent *event) { if (event->type() == QEvent::UpdateRequest) { @@ -451,6 +619,7 @@ void QGstVideoRendererSink::class_init(gpointer g_class, gpointer class_data) base_sink_class->propose_allocation = QGstVideoRendererSink::propose_allocation; base_sink_class->stop = QGstVideoRendererSink::stop; base_sink_class->unlock = QGstVideoRendererSink::unlock; + base_sink_class->query = QGstVideoRendererSink::query; GstElementClass *element_class = reinterpret_cast<GstElementClass *>(g_class); element_class->change_state = QGstVideoRendererSink::change_state; @@ -616,4 +785,13 @@ GstFlowReturn QGstVideoRendererSink::show_frame(GstVideoSink *base, GstBuffer *b return sink->delegate->render(buffer); } +gboolean QGstVideoRendererSink::query(GstBaseSink *base, GstQuery *query) +{ + VO_SINK(base); + if (sink->delegate->query(query)) + return TRUE; + + return GST_BASE_SINK_CLASS(sink_parent_class)->query(base, query); +} + QT_END_NAMESPACE diff --git a/src/gsttools/qgstvideorenderersink_p.h b/src/gsttools/qgstvideorenderersink_p.h index b1e333566..84162814c 100644 --- a/src/gsttools/qgstvideorenderersink_p.h +++ b/src/gsttools/qgstvideorenderersink_p.h @@ -51,6 +51,7 @@ // We mean it. // +#include <QtMultimedia/private/qtmultimediaglobal_p.h> #include <gst/video/gstvideosink.h> #include <gst/video/video.h> @@ -67,6 +68,13 @@ #include "qgstvideorendererplugin_p.h" +#if QT_CONFIG(gstreamer_gl) +#ifndef GST_USE_UNSTABLE_API +#define GST_USE_UNSTABLE_API +#endif +#include <gst/gl/gl.h> +#endif + QT_BEGIN_NAMESPACE class QAbstractVideoSurface; @@ -89,6 +97,7 @@ private: QVideoSurfaceFormat m_format; GstVideoInfo m_videoInfo; bool m_flushed = true; + QAbstractVideoBuffer::HandleType m_handleType = QAbstractVideoBuffer::NoHandle; }; class QVideoSurfaceGstDelegate : public QObject @@ -110,6 +119,7 @@ public: GstFlowReturn render(GstBuffer *buffer); bool event(QEvent *event) override; + bool query(GstQuery *query); private slots: bool handleEvent(QMutexLocker *locker); @@ -132,6 +142,9 @@ private: GstCaps *m_surfaceCaps = nullptr; GstCaps *m_startCaps = nullptr; GstBuffer *m_renderBuffer = nullptr; +#if QT_CONFIG(gstreamer_gl) + GstGLContext *m_gstGLDisplayContext = nullptr; +#endif bool m_notified = false; bool m_stop = false; @@ -168,6 +181,7 @@ private: static gboolean unlock(GstBaseSink *sink); static GstFlowReturn show_frame(GstVideoSink *sink, GstBuffer *buffer); + static gboolean query(GstBaseSink *element, GstQuery *query); private: QVideoSurfaceGstDelegate *delegate = nullptr; diff --git a/src/imports/audioengine/qdeclarative_attenuationmodel_p.cpp b/src/imports/audioengine/qdeclarative_attenuationmodel_p.cpp index 729558cd2..9d3c4fcb6 100644 --- a/src/imports/audioengine/qdeclarative_attenuationmodel_p.cpp +++ b/src/imports/audioengine/qdeclarative_attenuationmodel_p.cpp @@ -84,6 +84,7 @@ void QDeclarativeAttenuationModel::setName(const QString& name) \ingroup multimedia_audioengine \inherits Item \preliminary + \deprecated AttenuationModelLinear must be defined inside \l AudioEngine or be added to it using \l{QtAudioEngine::AudioEngine::addAttenuationModel()}{AudioEngine.addAttenuationModel()} @@ -213,6 +214,7 @@ qreal QDeclarativeAttenuationModelLinear::calculateGain(const QVector3D &listene \ingroup multimedia_audioengine \inherits Item \preliminary + \deprecated AttenuationModelInverse must be defined inside \l AudioEngine or be added to it using \l{QtAudioEngine::AudioEngine::addAttenuationModel()}{AudioEngine.addAttenuationModel()} diff --git a/src/imports/audioengine/qdeclarative_audiocategory_p.cpp b/src/imports/audioengine/qdeclarative_audiocategory_p.cpp index 84ba6b190..3561e3800 100644 --- a/src/imports/audioengine/qdeclarative_audiocategory_p.cpp +++ b/src/imports/audioengine/qdeclarative_audiocategory_p.cpp @@ -53,6 +53,7 @@ QT_USE_NAMESPACE \ingroup multimedia_audioengine \inherits Item \preliminary + \deprecated An instance of AudioCategory can be accessed through \l {QtAudioEngine::AudioEngine::categories} {AudioEngine.categories} with its unique name and must be defined inside AudioEngine or be added diff --git a/src/imports/audioengine/qdeclarative_audioengine_p.cpp b/src/imports/audioengine/qdeclarative_audioengine_p.cpp index 24d878dd8..96046fa31 100644 --- a/src/imports/audioengine/qdeclarative_audioengine_p.cpp +++ b/src/imports/audioengine/qdeclarative_audioengine_p.cpp @@ -62,6 +62,7 @@ QT_BEGIN_NAMESPACE \ingroup multimedia_audioengine \inherits Item \preliminary + \deprecated \qml Rectangle { diff --git a/src/imports/audioengine/qdeclarative_audiolistener_p.cpp b/src/imports/audioengine/qdeclarative_audiolistener_p.cpp index 39a30171b..4ed305a72 100644 --- a/src/imports/audioengine/qdeclarative_audiolistener_p.cpp +++ b/src/imports/audioengine/qdeclarative_audiolistener_p.cpp @@ -54,6 +54,7 @@ QT_USE_NAMESPACE \ingroup multimedia_audioengine \inherits Item \preliminary + \deprecated AudioListener will have only one global instance and you can either access it through the listener property of AudioEngine: diff --git a/src/imports/audioengine/qdeclarative_audiosample_p.cpp b/src/imports/audioengine/qdeclarative_audiosample_p.cpp index 4eccf5052..2e521edd9 100644 --- a/src/imports/audioengine/qdeclarative_audiosample_p.cpp +++ b/src/imports/audioengine/qdeclarative_audiosample_p.cpp @@ -56,6 +56,7 @@ QT_USE_NAMESPACE \ingroup multimedia_audioengine \inherits Item \preliminary + \deprecated It can be accessed through QtAudioEngine::AudioEngine::samples with its unique name and must be defined inside AudioEngine or be added to it using diff --git a/src/imports/audioengine/qdeclarative_playvariation_p.cpp b/src/imports/audioengine/qdeclarative_playvariation_p.cpp index e6d3697d0..f0471d145 100644 --- a/src/imports/audioengine/qdeclarative_playvariation_p.cpp +++ b/src/imports/audioengine/qdeclarative_playvariation_p.cpp @@ -59,6 +59,7 @@ QT_USE_NAMESPACE \ingroup multimedia_audioengine \inherits Item \preliminary + \deprecated PlayVariation must be defined inside a \l Sound or be added to it using \l{QtAudioEngine::Sound::addPlayVariation()}{Sound.addPlayVariation()} diff --git a/src/imports/audioengine/qdeclarative_sound_p.cpp b/src/imports/audioengine/qdeclarative_sound_p.cpp index 347198f61..f07468eec 100644 --- a/src/imports/audioengine/qdeclarative_sound_p.cpp +++ b/src/imports/audioengine/qdeclarative_sound_p.cpp @@ -166,6 +166,7 @@ void QDeclarativeSoundCone::setEngine(QDeclarativeAudioEngine *engine) \ingroup multimedia_audioengine \inherits Item \preliminary + \deprecated Sound can be accessed through QtAudioEngine::AudioEngine::sounds with its unique name and must be defined inside AudioEngine or be added to it using diff --git a/src/imports/audioengine/qdeclarative_soundinstance_p.cpp b/src/imports/audioengine/qdeclarative_soundinstance_p.cpp index ad7480031..1bdb82343 100644 --- a/src/imports/audioengine/qdeclarative_soundinstance_p.cpp +++ b/src/imports/audioengine/qdeclarative_soundinstance_p.cpp @@ -57,6 +57,7 @@ QT_USE_NAMESPACE \ingroup multimedia_audioengine \inherits Item \preliminary + \deprecated There are two ways to create SoundInstance objects. You can obtain it by calling newInstance method of a \l Sound: diff --git a/src/imports/multimedia/plugins.qmltypes b/src/imports/multimedia/plugins.qmltypes index 4b5298b6a..870544160 100644 --- a/src/imports/multimedia/plugins.qmltypes +++ b/src/imports/multimedia/plugins.qmltypes @@ -4,11 +4,285 @@ import QtQuick.tooling 1.2 // It is used for QML tooling purposes only. // // This file was auto-generated by: -// 'qmlplugindump -nonrelocatable QtMultimedia 5.13' +// 'qmlplugindump -nonrelocatable QtMultimedia 5.14' Module { dependencies: ["QtQuick 2.0"] Component { + name: "QAbstractItemModel" + prototype: "QObject" + Enum { + name: "LayoutChangeHint" + values: { + "NoLayoutChangeHint": 0, + "VerticalSortHint": 1, + "HorizontalSortHint": 2 + } + } + Enum { + name: "CheckIndexOption" + values: { + "NoOption": 0, + "IndexIsValid": 1, + "DoNotUseParent": 2, + "ParentIsInvalid": 4 + } + } + Signal { + name: "dataChanged" + Parameter { name: "topLeft"; type: "QModelIndex" } + Parameter { name: "bottomRight"; type: "QModelIndex" } + Parameter { name: "roles"; type: "QVector<int>" } + } + Signal { + name: "dataChanged" + Parameter { name: "topLeft"; type: "QModelIndex" } + Parameter { name: "bottomRight"; type: "QModelIndex" } + } + Signal { + name: "headerDataChanged" + Parameter { name: "orientation"; type: "Qt::Orientation" } + Parameter { name: "first"; type: "int" } + Parameter { name: "last"; type: "int" } + } + Signal { + name: "layoutChanged" + Parameter { name: "parents"; type: "QList<QPersistentModelIndex>" } + Parameter { name: "hint"; type: "QAbstractItemModel::LayoutChangeHint" } + } + Signal { + name: "layoutChanged" + Parameter { name: "parents"; type: "QList<QPersistentModelIndex>" } + } + Signal { name: "layoutChanged" } + Signal { + name: "layoutAboutToBeChanged" + Parameter { name: "parents"; type: "QList<QPersistentModelIndex>" } + Parameter { name: "hint"; type: "QAbstractItemModel::LayoutChangeHint" } + } + Signal { + name: "layoutAboutToBeChanged" + Parameter { name: "parents"; type: "QList<QPersistentModelIndex>" } + } + Signal { name: "layoutAboutToBeChanged" } + Signal { + name: "rowsAboutToBeInserted" + Parameter { name: "parent"; type: "QModelIndex" } + Parameter { name: "first"; type: "int" } + Parameter { name: "last"; type: "int" } + } + Signal { + name: "rowsInserted" + Parameter { name: "parent"; type: "QModelIndex" } + Parameter { name: "first"; type: "int" } + Parameter { name: "last"; type: "int" } + } + Signal { + name: "rowsAboutToBeRemoved" + Parameter { name: "parent"; type: "QModelIndex" } + Parameter { name: "first"; type: "int" } + Parameter { name: "last"; type: "int" } + } + Signal { + name: "rowsRemoved" + Parameter { name: "parent"; type: "QModelIndex" } + Parameter { name: "first"; type: "int" } + Parameter { name: "last"; type: "int" } + } + Signal { + name: "columnsAboutToBeInserted" + Parameter { name: "parent"; type: "QModelIndex" } + Parameter { name: "first"; type: "int" } + Parameter { name: "last"; type: "int" } + } + Signal { + name: "columnsInserted" + Parameter { name: "parent"; type: "QModelIndex" } + Parameter { name: "first"; type: "int" } + Parameter { name: "last"; type: "int" } + } + Signal { + name: "columnsAboutToBeRemoved" + Parameter { name: "parent"; type: "QModelIndex" } + Parameter { name: "first"; type: "int" } + Parameter { name: "last"; type: "int" } + } + Signal { + name: "columnsRemoved" + Parameter { name: "parent"; type: "QModelIndex" } + Parameter { name: "first"; type: "int" } + Parameter { name: "last"; type: "int" } + } + Signal { name: "modelAboutToBeReset" } + Signal { name: "modelReset" } + Signal { + name: "rowsAboutToBeMoved" + Parameter { name: "sourceParent"; type: "QModelIndex" } + Parameter { name: "sourceStart"; type: "int" } + Parameter { name: "sourceEnd"; type: "int" } + Parameter { name: "destinationParent"; type: "QModelIndex" } + Parameter { name: "destinationRow"; type: "int" } + } + Signal { + name: "rowsMoved" + Parameter { name: "parent"; type: "QModelIndex" } + Parameter { name: "start"; type: "int" } + Parameter { name: "end"; type: "int" } + Parameter { name: "destination"; type: "QModelIndex" } + Parameter { name: "row"; type: "int" } + } + Signal { + name: "columnsAboutToBeMoved" + Parameter { name: "sourceParent"; type: "QModelIndex" } + Parameter { name: "sourceStart"; type: "int" } + Parameter { name: "sourceEnd"; type: "int" } + Parameter { name: "destinationParent"; type: "QModelIndex" } + Parameter { name: "destinationColumn"; type: "int" } + } + Signal { + name: "columnsMoved" + Parameter { name: "parent"; type: "QModelIndex" } + Parameter { name: "start"; type: "int" } + Parameter { name: "end"; type: "int" } + Parameter { name: "destination"; type: "QModelIndex" } + Parameter { name: "column"; type: "int" } + } + Method { name: "submit"; type: "bool" } + Method { name: "revert" } + Method { + name: "hasIndex" + type: "bool" + Parameter { name: "row"; type: "int" } + Parameter { name: "column"; type: "int" } + Parameter { name: "parent"; type: "QModelIndex" } + } + Method { + name: "hasIndex" + type: "bool" + Parameter { name: "row"; type: "int" } + Parameter { name: "column"; type: "int" } + } + Method { + name: "index" + type: "QModelIndex" + Parameter { name: "row"; type: "int" } + Parameter { name: "column"; type: "int" } + Parameter { name: "parent"; type: "QModelIndex" } + } + Method { + name: "index" + type: "QModelIndex" + Parameter { name: "row"; type: "int" } + Parameter { name: "column"; type: "int" } + } + Method { + name: "parent" + type: "QModelIndex" + Parameter { name: "child"; type: "QModelIndex" } + } + Method { + name: "sibling" + type: "QModelIndex" + Parameter { name: "row"; type: "int" } + Parameter { name: "column"; type: "int" } + Parameter { name: "idx"; type: "QModelIndex" } + } + Method { + name: "rowCount" + type: "int" + Parameter { name: "parent"; type: "QModelIndex" } + } + Method { name: "rowCount"; type: "int" } + Method { + name: "columnCount" + type: "int" + Parameter { name: "parent"; type: "QModelIndex" } + } + Method { name: "columnCount"; type: "int" } + Method { + name: "hasChildren" + type: "bool" + Parameter { name: "parent"; type: "QModelIndex" } + } + Method { name: "hasChildren"; type: "bool" } + Method { + name: "data" + type: "QVariant" + Parameter { name: "index"; type: "QModelIndex" } + Parameter { name: "role"; type: "int" } + } + Method { + name: "data" + type: "QVariant" + Parameter { name: "index"; type: "QModelIndex" } + } + Method { + name: "setData" + type: "bool" + Parameter { name: "index"; type: "QModelIndex" } + Parameter { name: "value"; type: "QVariant" } + Parameter { name: "role"; type: "int" } + } + Method { + name: "setData" + type: "bool" + Parameter { name: "index"; type: "QModelIndex" } + Parameter { name: "value"; type: "QVariant" } + } + Method { + name: "headerData" + type: "QVariant" + Parameter { name: "section"; type: "int" } + Parameter { name: "orientation"; type: "Qt::Orientation" } + Parameter { name: "role"; type: "int" } + } + Method { + name: "headerData" + type: "QVariant" + Parameter { name: "section"; type: "int" } + Parameter { name: "orientation"; type: "Qt::Orientation" } + } + Method { + name: "fetchMore" + Parameter { name: "parent"; type: "QModelIndex" } + } + Method { + name: "canFetchMore" + type: "bool" + Parameter { name: "parent"; type: "QModelIndex" } + } + Method { + name: "flags" + type: "Qt::ItemFlags" + Parameter { name: "index"; type: "QModelIndex" } + } + Method { + name: "match" + type: "QModelIndexList" + Parameter { name: "start"; type: "QModelIndex" } + Parameter { name: "role"; type: "int" } + Parameter { name: "value"; type: "QVariant" } + Parameter { name: "hits"; type: "int" } + Parameter { name: "flags"; type: "Qt::MatchFlags" } + } + Method { + name: "match" + type: "QModelIndexList" + Parameter { name: "start"; type: "QModelIndex" } + Parameter { name: "role"; type: "int" } + Parameter { name: "value"; type: "QVariant" } + Parameter { name: "hits"; type: "int" } + } + Method { + name: "match" + type: "QModelIndexList" + Parameter { name: "start"; type: "QModelIndex" } + Parameter { name: "role"; type: "int" } + Parameter { name: "value"; type: "QVariant" } + } + } + Component { name: "QAbstractListModel"; prototype: "QAbstractItemModel" } + Component { name: "QAbstractVideoFilter" prototype: "QObject" Property { name: "active"; type: "bool" } diff --git a/src/imports/multimedia/qdeclarativeplaylist.cpp b/src/imports/multimedia/qdeclarativeplaylist.cpp index b768f99e3..400e23467 100644 --- a/src/imports/multimedia/qdeclarativeplaylist.cpp +++ b/src/imports/multimedia/qdeclarativeplaylist.cpp @@ -232,7 +232,7 @@ void QDeclarativePlaylist::setPlaybackMode(PlaybackMode mode) */ QUrl QDeclarativePlaylist::currentItemSource() const { - return m_playlist->currentMedia().canonicalUrl(); + return m_playlist->currentMedia().request().url(); } /*! @@ -316,7 +316,7 @@ QString QDeclarativePlaylist::errorString() const */ QUrl QDeclarativePlaylist::itemSource(int index) { - return m_playlist->media(index).canonicalUrl(); + return m_playlist->media(index).request().url(); } /*! @@ -548,7 +548,7 @@ QVariant QDeclarativePlaylist::data(const QModelIndex &index, int role) const if (!index.isValid()) return QVariant(); - return m_playlist->media(index.row()).canonicalUrl(); + return m_playlist->media(index.row()).request().url(); } QHash<int, QByteArray> QDeclarativePlaylist::roleNames() const diff --git a/src/imports/multimedia/qdeclarativeradio.cpp b/src/imports/multimedia/qdeclarativeradio.cpp index f92ddd91a..655b87ca5 100644 --- a/src/imports/multimedia/qdeclarativeradio.cpp +++ b/src/imports/multimedia/qdeclarativeradio.cpp @@ -50,6 +50,7 @@ QT_BEGIN_NAMESPACE \ingroup multimedia_qml \ingroup multimedia_radio_qml \inherits Item + \deprecated \qml Rectangle { diff --git a/src/multimedia/audio/qaudiobuffer.cpp b/src/multimedia/audio/qaudiobuffer.cpp index 1e43ebd00..999f280b3 100644 --- a/src/multimedia/audio/qaudiobuffer.cpp +++ b/src/multimedia/audio/qaudiobuffer.cpp @@ -164,7 +164,7 @@ QAudioBufferPrivate *QAudioBufferPrivate::clone() // We want to create a single bufferprivate with a // single qaab // This should only be called when the count is > 1 - Q_ASSERT(mCount.load() > 1); + Q_ASSERT(mCount.loadRelaxed() > 1); if (mProvider) { QAbstractAudioBuffer *abuf = mProvider->clone(); @@ -458,7 +458,7 @@ void *QAudioBuffer::data() if (!isValid()) return nullptr; - if (d->mCount.load() != 1) { + if (d->mCount.loadRelaxed() != 1) { // Can't share a writable buffer // so we need to detach QAudioBufferPrivate *newd = d->clone(); @@ -483,7 +483,7 @@ void *QAudioBuffer::data() if (memBuffer) { d->mProvider->release(); - d->mCount.store(1); + d->mCount.storeRelaxed(1); d->mProvider = memBuffer; return memBuffer->writableData(); diff --git a/src/multimedia/audio/qaudiodeviceinfo.cpp b/src/multimedia/audio/qaudiodeviceinfo.cpp index b8cac18eb..051ef8b3f 100644 --- a/src/multimedia/audio/qaudiodeviceinfo.cpp +++ b/src/multimedia/audio/qaudiodeviceinfo.cpp @@ -328,16 +328,12 @@ QAudioFormat QAudioDeviceInfo::nearestFormat(const QAudioFormat &settings) const nearest.setByteOrder(order); for (QAudioFormat::SampleType sample : qAsConst(testSampleTypes)) { nearest.setSampleType(sample); - QMapIterator<int, int> sz(testSampleSizes); - while (sz.hasNext()) { - sz.next(); - nearest.setSampleSize(sz.value()); + for (int sampleSize : qAsConst(testSampleSizes)) { + nearest.setSampleSize(sampleSize); for (int channel : qAsConst(testChannels)) { nearest.setChannelCount(channel); - QMapIterator<int, int> i(testSampleRates); - while (i.hasNext()) { - i.next(); - nearest.setSampleRate(i.value()); + for (int sampleRate : qAsConst(testSampleRates)) { + nearest.setSampleRate(sampleRate); if (isFormatSupported(nearest)) return nearest; } @@ -449,7 +445,10 @@ QAudioDeviceInfo::QAudioDeviceInfo(const QString &realm, const QByteArray &handl } /*! - \internal + Returns the key that represents the audio plugin. + + \since 5.14 + \sa QAudioSystemPlugin */ QString QAudioDeviceInfo::realm() const { diff --git a/src/multimedia/audio/qaudiodeviceinfo.h b/src/multimedia/audio/qaudiodeviceinfo.h index 390458b39..015c8bad7 100644 --- a/src/multimedia/audio/qaudiodeviceinfo.h +++ b/src/multimedia/audio/qaudiodeviceinfo.h @@ -87,6 +87,7 @@ public: QList<int> supportedSampleSizes() const; QList<QAudioFormat::Endian> supportedByteOrders() const; QList<QAudioFormat::SampleType> supportedSampleTypes() const; + QString realm() const; static QAudioDeviceInfo defaultInputDevice(); static QAudioDeviceInfo defaultOutputDevice(); @@ -95,7 +96,6 @@ public: private: QAudioDeviceInfo(const QString &realm, const QByteArray &handle, QAudio::Mode mode); - QString realm() const; QByteArray handle() const; QAudio::Mode mode() const; diff --git a/src/multimedia/audio/qsamplecache_p.cpp b/src/multimedia/audio/qsamplecache_p.cpp index 35234f8bb..8c4fdc210 100644 --- a/src/multimedia/audio/qsamplecache_p.cpp +++ b/src/multimedia/audio/qsamplecache_p.cpp @@ -47,6 +47,8 @@ #include <QtCore/QDebug> //#define QT_SAMPLECACHE_DEBUG +#include <mutex> + QT_BEGIN_NAMESPACE @@ -98,7 +100,6 @@ QT_BEGIN_NAMESPACE QSampleCache::QSampleCache(QObject *parent) : QObject(parent) , m_networkAccessManager(nullptr) - , m_mutex(QMutex::Recursive) , m_capacity(0) , m_usage(0) , m_loadingRefCount(0) @@ -117,7 +118,7 @@ QNetworkAccessManager& QSampleCache::networkAccessManager() QSampleCache::~QSampleCache() { - QMutexLocker m(&m_mutex); + const std::lock_guard<QRecursiveMutex> locker(m_mutex); m_loadingThread.quit(); m_loadingThread.wait(); @@ -157,7 +158,7 @@ bool QSampleCache::isLoading() const bool QSampleCache::isCached(const QUrl &url) const { - QMutexLocker locker(&m_mutex); + const std::lock_guard<QRecursiveMutex> locker(m_mutex); return m_samples.contains(url); } @@ -174,7 +175,7 @@ QSample* QSampleCache::requestSample(const QUrl& url) #ifdef QT_SAMPLECACHE_DEBUG qDebug() << "QSampleCache: request sample [" << url << "]"; #endif - QMutexLocker locker(&m_mutex); + std::unique_lock<QRecursiveMutex> locker(m_mutex); QMap<QUrl, QSample*>::iterator it = m_samples.find(url); QSample* sample; if (it == m_samples.end()) { @@ -194,7 +195,7 @@ QSample* QSampleCache::requestSample(const QUrl& url) void QSampleCache::setCapacity(qint64 capacity) { - QMutexLocker locker(&m_mutex); + const std::lock_guard<QRecursiveMutex> locker(m_mutex); if (m_capacity == capacity) return; #ifdef QT_SAMPLECACHE_DEBUG @@ -227,7 +228,7 @@ void QSampleCache::unloadSample(QSample *sample) // Called in both threads void QSampleCache::refresh(qint64 usageChange) { - QMutexLocker locker(&m_mutex); + const std::lock_guard<QRecursiveMutex> locker(m_mutex); m_usage += usageChange; if (m_capacity <= 0 || m_usage <= m_capacity) return; @@ -265,7 +266,7 @@ void QSampleCache::refresh(qint64 usageChange) // Called in both threads void QSampleCache::removeUnreferencedSample(QSample *sample) { - QMutexLocker m(&m_mutex); + const std::lock_guard<QRecursiveMutex> locker(m_mutex); m_staleSamples.remove(sample); } @@ -301,7 +302,8 @@ bool QSampleCache::notifyUnreferencedSample(QSample* sample) if (m_loadingThread.isRunning()) m_loadingThread.wait(); - QMutexLocker locker(&m_mutex); + const std::lock_guard<QRecursiveMutex> locker(m_mutex); + if (m_capacity > 0) return false; m_samples.remove(sample->m_url); diff --git a/src/multimedia/audio/qsamplecache_p.h b/src/multimedia/audio/qsamplecache_p.h index 094e3281e..4c2384743 100644 --- a/src/multimedia/audio/qsamplecache_p.h +++ b/src/multimedia/audio/qsamplecache_p.h @@ -143,7 +143,7 @@ private: QMap<QUrl, QSample*> m_samples; QSet<QSample*> m_staleSamples; QNetworkAccessManager *m_networkAccessManager; - mutable QMutex m_mutex; + mutable QRecursiveMutex m_mutex; qint64 m_capacity; qint64 m_usage; QThread m_loadingThread; diff --git a/src/multimedia/camera/qcameraexposure.h b/src/multimedia/camera/qcameraexposure.h index f8eb68fbf..a1dc96701 100644 --- a/src/multimedia/camera/qcameraexposure.h +++ b/src/multimedia/camera/qcameraexposure.h @@ -165,11 +165,13 @@ Q_SIGNALS: void isoSensitivityChanged(int); void exposureCompensationChanged(qreal); +protected: + virtual ~QCameraExposure(); + private: friend class QCamera; friend class QCameraPrivate; explicit QCameraExposure(QCamera *parent = nullptr); - virtual ~QCameraExposure(); Q_DISABLE_COPY(QCameraExposure) Q_DECLARE_PRIVATE(QCameraExposure) diff --git a/src/multimedia/camera/qcamerafocus.cpp b/src/multimedia/camera/qcamerafocus.cpp index 33e280205..980b9dc93 100644 --- a/src/multimedia/camera/qcamerafocus.cpp +++ b/src/multimedia/camera/qcamerafocus.cpp @@ -325,8 +325,6 @@ class QCameraFocusPrivate : public QMediaObjectPrivate public: void initControls(); - QCameraFocus *q_ptr; - QCamera *camera; QCameraFocusControl *focusControl; @@ -373,12 +371,11 @@ void QCameraFocusPrivate::initControls() Construct a QCameraFocus for \a camera. */ -QCameraFocus::QCameraFocus(QCamera *camera): - QObject(camera), d_ptr(new QCameraFocusPrivate) +QCameraFocus::QCameraFocus(QCamera *camera) + : QObject(*new QCameraFocusPrivate, camera) { Q_D(QCameraFocus); d->camera = camera; - d->q_ptr = this; d->initControls(); } @@ -389,7 +386,6 @@ QCameraFocus::QCameraFocus(QCamera *camera): QCameraFocus::~QCameraFocus() { - delete d_ptr; } /*! diff --git a/src/multimedia/camera/qcamerafocus.h b/src/multimedia/camera/qcamerafocus.h index 31d056de9..a5d7725e3 100644 --- a/src/multimedia/camera/qcamerafocus.h +++ b/src/multimedia/camera/qcamerafocus.h @@ -152,15 +152,19 @@ Q_SIGNALS: void maximumOpticalZoomChanged(qreal); void maximumDigitalZoomChanged(qreal); +protected: + ~QCameraFocus(); + private: friend class QCamera; friend class QCameraPrivate; QCameraFocus(QCamera *camera); - ~QCameraFocus(); Q_DISABLE_COPY(QCameraFocus) Q_DECLARE_PRIVATE(QCameraFocus) - QCameraFocusPrivate *d_ptr; +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) + QCameraFocusPrivate *d_ptr_deprecated; +#endif }; Q_DECLARE_OPERATORS_FOR_FLAGS(QCameraFocus::FocusModes) diff --git a/src/multimedia/camera/qcameraimageprocessing.cpp b/src/multimedia/camera/qcameraimageprocessing.cpp index 27b7f05bd..af6c22391 100644 --- a/src/multimedia/camera/qcameraimageprocessing.cpp +++ b/src/multimedia/camera/qcameraimageprocessing.cpp @@ -114,8 +114,6 @@ class QCameraImageProcessingPrivate : public QMediaObjectPrivate public: void initControls(); - QCameraImageProcessing *q_ptr; - QCamera *camera; QCameraImageProcessingControl *imageControl; bool available; @@ -140,12 +138,11 @@ void QCameraImageProcessingPrivate::initControls() Construct a QCameraImageProcessing for \a camera. */ -QCameraImageProcessing::QCameraImageProcessing(QCamera *camera): - QObject(camera), d_ptr(new QCameraImageProcessingPrivate) +QCameraImageProcessing::QCameraImageProcessing(QCamera *camera) + : QObject(*new QCameraImageProcessingPrivate, camera) { Q_D(QCameraImageProcessing); d->camera = camera; - d->q_ptr = this; d->initControls(); } @@ -156,7 +153,6 @@ QCameraImageProcessing::QCameraImageProcessing(QCamera *camera): QCameraImageProcessing::~QCameraImageProcessing() { - delete d_ptr; } diff --git a/src/multimedia/camera/qcameraimageprocessing.h b/src/multimedia/camera/qcameraimageprocessing.h index 3eb7c8569..f76daf85e 100644 --- a/src/multimedia/camera/qcameraimageprocessing.h +++ b/src/multimedia/camera/qcameraimageprocessing.h @@ -116,15 +116,19 @@ public: void setColorFilter(ColorFilter filter); bool isColorFilterSupported(ColorFilter filter) const; +protected: + ~QCameraImageProcessing(); + private: friend class QCamera; friend class QCameraPrivate; QCameraImageProcessing(QCamera *camera); - ~QCameraImageProcessing(); Q_DISABLE_COPY(QCameraImageProcessing) Q_DECLARE_PRIVATE(QCameraImageProcessing) - QCameraImageProcessingPrivate *d_ptr; +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) + QCameraImageProcessingPrivate *d_ptr_deprecated; +#endif }; QT_END_NAMESPACE diff --git a/src/multimedia/configure.json b/src/multimedia/configure.json index 2db8ce55c..0e9cfc9f7 100644 --- a/src/multimedia/configure.json +++ b/src/multimedia/configure.json @@ -55,7 +55,8 @@ { "type": "pkgConfig", "args": "gstreamer-1.0 gstreamer-base-1.0 gstreamer-audio-1.0 gstreamer-video-1.0 gstreamer-pbutils-1.0" }, { "libs": "-lgstreamer-1.0 -lgstbase-1.0 -lgstaudio-1.0 -lgstvideo-1.0 -lgstpbutils-1.0 -lglib-2.0 -lgobject-2.0", - "condition": "config.win32 || config.macos" } + "condition": "config.win32 || config.macos" }, + { "libs": "", "condition": "config.android && input.gstreamer != ''" } ] }, "gstreamer_app_0_10": { @@ -74,7 +75,8 @@ "use": "gstreamer_1_0", "sources": [ { "type": "pkgConfig", "args": "gstreamer-app-1.0" }, - { "libs": "-lgstapp-1.0", "condition": "config.win32 || config.macos" } + { "libs": "-lgstapp-1.0", "condition": "config.win32 || config.macos" }, + { "libs": "", "condition": "config.android && input.gstreamer != ''" } ] }, "gstreamer_photography_0_10": { @@ -95,6 +97,17 @@ { "libs": "-lgstphotography-1.0" } ] }, + "gstreamer_gl_1_0": { + "label": "GStreamer OpenGL 1.0", + "export": "gstreamer_gl", + "test": { + "include": "gst/gl/gl.h" + }, + "use": "gstreamer_1_0", + "sources": [ + { "type": "pkgConfig", "args": "gstreamer-gl-1.0" } + ] + }, "gstreamer_imxcommon": { "label": "GStreamer i.MX common", "export": "gstreamer_imxcommon", @@ -241,6 +254,11 @@ "condition": "(features.gstreamer_1_0 && libs.gstreamer_photography_1_0) || (features.gstreamer_0_10 && libs.gstreamer_photography_0_10)", "output": [ "privateFeature" ] }, + "gstreamer_gl": { + "label": "GStreamer OpenGL", + "condition": "features.gstreamer_1_0 && libs.gstreamer_gl_1_0", + "output": [ "privateFeature" ] + }, "gstreamer_imxcommon": { "label": "GStreamer i.MX common", "condition": "(features.gstreamer_1_0 && libs.gstreamer_imxcommon)", diff --git a/src/multimedia/doc/snippets/multimedia-snippets/audio.cpp b/src/multimedia/doc/snippets/multimedia-snippets/audio.cpp index 9646b708e..57d3adfb4 100644 --- a/src/multimedia/doc/snippets/multimedia-snippets/audio.cpp +++ b/src/multimedia/doc/snippets/multimedia-snippets/audio.cpp @@ -213,7 +213,8 @@ void AudioDeviceInfo() //! [Setting audio format] //! [Dumping audio formats] - foreach (const QAudioDeviceInfo &deviceInfo, QAudioDeviceInfo::availableDevices(QAudio::AudioOutput)) + const auto deviceInfos = QAudioDeviceInfo::availableDevices(QAudio::AudioOutput); + for (const QAudioDeviceInfo &deviceInfo : deviceInfos) qDebug() << "Device name: " << deviceInfo.deviceName(); //! [Dumping audio formats] } diff --git a/src/multimedia/doc/snippets/multimedia-snippets/camera.cpp b/src/multimedia/doc/snippets/multimedia-snippets/camera.cpp index 52f3203be..f851caadd 100644 --- a/src/multimedia/doc/snippets/multimedia-snippets/camera.cpp +++ b/src/multimedia/doc/snippets/multimedia-snippets/camera.cpp @@ -179,8 +179,8 @@ void overview_movie() void camera_listing() { //! [Camera listing] - QList<QCameraInfo> cameras = QCameraInfo::availableCameras(); - foreach (const QCameraInfo &cameraInfo, cameras) + const QList<QCameraInfo> cameras = QCameraInfo::availableCameras(); + for (const QCameraInfo &cameraInfo : cameras) qDebug() << cameraInfo.deviceName(); //! [Camera listing] } @@ -188,8 +188,8 @@ void camera_listing() void camera_selection() { //! [Camera selection] - QList<QCameraInfo> cameras = QCameraInfo::availableCameras(); - foreach (const QCameraInfo &cameraInfo, cameras) { + const QList<QCameraInfo> cameras = QCameraInfo::availableCameras(); + for (const QCameraInfo &cameraInfo : cameras) { if (cameraInfo.deviceName() == "mycamera") camera = new QCamera(cameraInfo); } @@ -269,8 +269,8 @@ void camerafocus() //! [Camera focus zones] focus->setFocusPointMode(QCameraFocus::FocusPointAuto); - QList<QCameraFocusZone> zones = focus->focusZones(); - foreach (QCameraFocusZone zone, zones) { + const QList<QCameraFocusZone> zones = focus->focusZones(); + for (const QCameraFocusZone &zone : zones) { if (zone.status() == QCameraFocusZone::Focused) { // Draw a green box at zone.area() } else if (zone.status() == QCameraFocusZone::Selected) { diff --git a/src/multimedia/doc/snippets/multimedia-snippets/media.cpp b/src/multimedia/doc/snippets/multimedia-snippets/media.cpp index 4e8c06409..8ec7cb072 100644 --- a/src/multimedia/doc/snippets/multimedia-snippets/media.cpp +++ b/src/multimedia/doc/snippets/multimedia-snippets/media.cpp @@ -254,10 +254,10 @@ void MediaExample::AudioRecorder() //! [Audio recorder] //! [Audio recorder inputs] - QStringList inputs = audioRecorder->audioInputs(); + const QStringList inputs = audioRecorder->audioInputs(); QString selectedInput = audioRecorder->defaultAudioInput(); - foreach (QString input, inputs) { + for (const QString &input : inputs) { QString description = audioRecorder->audioInputDescription(input); // show descriptions to user and allow selection selectedInput = input; diff --git a/src/multimedia/doc/src/platform-notes-gstreamer-on-android.qdoc b/src/multimedia/doc/src/platform-notes-gstreamer-on-android.qdoc new file mode 100644 index 000000000..51836d99a --- /dev/null +++ b/src/multimedia/doc/src/platform-notes-gstreamer-on-android.qdoc @@ -0,0 +1,59 @@ +/**************************************************************************** +** +** Copyright (C) 2019 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:FDL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Free Documentation License Usage +** Alternatively, this file may be used under the terms of the GNU Free +** Documentation License version 1.3 as published by the Free Software +** Foundation and appearing in the file included in the packaging of +** this file. Please review the following information to ensure +** the GNU Free Documentation License version 1.3 requirements +** will be met: https://www.gnu.org/licenses/fdl-1.3.html. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +/*! +\page platform-notes-gstreamer-on-android.html +\title Qt Multimedia GStreamer on Android +\brief Platform notes for GStreamer on Android +\since 5.14 + +This page covers the availability of GStreamer on Android. + +\section1 Limitations + +Since GStreamer is licensed under LGPL and distributed in archives (and should be statically linked), +Qt Multimedia does not provide support of GStreamer on Android by default. + +Therefore GStreamer support must be explicitly enabled by configuring Qt with the \c -gstreamer option. + +\section1 Setup + +The GStreamer project provides prebuilt binaries which you can download and unzip into any location of your choice. + +The environment variable \c GSTREAMER_ROOT_ANDROID should be set to the location where you unzipped the downloaded package. + +\section1 Application + +Qt Multimedia does not contain any plugins and all needed plugins must be included +and registered in applications manually by \c GST_PLUGIN_STATIC_DECLARE and \c GST_PLUGIN_STATIC_REGISTER +after \c gst_init(). + +Please refer to the official manual on how to statically link plugins to an application. + +https://gstreamer.freedesktop.org/documentation/gstreamer/gstplugin.html?gi-language=c#GST_PLUGIN_STATIC_REGISTER + +*/ diff --git a/src/multimedia/multimedia.pro b/src/multimedia/multimedia.pro index 63c50f09e..6efee8040 100644 --- a/src/multimedia/multimedia.pro +++ b/src/multimedia/multimedia.pro @@ -69,7 +69,7 @@ include(video/video.pri) ANDROID_BUNDLED_JAR_DEPENDENCIES = \ jar/QtMultimedia.jar:org.qtproject.qt5.android.multimedia.QtMultimediaUtils ANDROID_LIB_DEPENDENCIES = \ - plugins/mediaservice/libqtmedia_android.so \ + plugins/mediaservice/libplugins_mediaservice_qtmedia_android.so \ lib/libQt5MultimediaQuick.so:Qt5Quick ANDROID_BUNDLED_FILES += \ lib/libQt5MultimediaQuick.so @@ -85,6 +85,14 @@ MODULE_WINRT_CAPABILITIES_DEVICE += \ microphone \ webcam +qtConfig(gstreamer) { + ANDROID_LIB_DEPENDENCIES += \ + plugins/mediaservice/libgstcamerabin.so \ + plugins/mediaservice/libgstmediacapture.so \ + plugins/mediaservice/libgstmediaplayer.so \ + plugins/mediaservice/libgstaudiodecoder.so +} + win32: LIBS_PRIVATE += -luuid HEADERS += $$PUBLIC_HEADERS $$PRIVATE_HEADERS diff --git a/src/multimedia/playback/qmediacontent.cpp b/src/multimedia/playback/qmediacontent.cpp index 95116d02f..6915ae7af 100644 --- a/src/multimedia/playback/qmediacontent.cpp +++ b/src/multimedia/playback/qmediacontent.cpp @@ -123,8 +123,7 @@ private: which provides the URL of the content. A non-null QMediaContent will always have a reference to - the content available through the canonicalUrl() or canonicalRequest() - methods. + the content available through the request() method. Alternatively QMediaContent can represent a playlist and contain a pointer to a valid QMediaPlaylist object. In this case URL is optional and can either be empty @@ -259,24 +258,39 @@ bool QMediaContent::isNull() const } /*! + \since 5.14 + + Returns a QNetworkRequest that represents the resource for this media content. +*/ + +QNetworkRequest QMediaContent::request() const +{ + return (d && !d->requests.isEmpty()) ? d->requests.first() : QNetworkRequest(); +} + +#if QT_DEPRECATED_SINCE(6, 0) +/*! + \obsolete + Returns a QUrl that represents that canonical resource for this media content. */ QUrl QMediaContent::canonicalUrl() const { - return canonicalRequest().url(); + return request().url(); } /*! + \obsolete + Returns a QNetworkRequest that represents that canonical resource for this media content. */ QNetworkRequest QMediaContent::canonicalRequest() const { - return (d && !d->requests.isEmpty()) ? d->requests.first() : QNetworkRequest(); + return request(); } -#if QT_DEPRECATED_SINCE(6, 0) /*! \obsolete diff --git a/src/multimedia/playback/qmediacontent.h b/src/multimedia/playback/qmediacontent.h index 5193a1fcc..244715b41 100644 --- a/src/multimedia/playback/qmediacontent.h +++ b/src/multimedia/playback/qmediacontent.h @@ -72,10 +72,11 @@ public: bool operator!=(const QMediaContent &other) const; bool isNull() const; + QNetworkRequest request() const; - QUrl canonicalUrl() const; - QNetworkRequest canonicalRequest() const; #if QT_DEPRECATED_SINCE(6, 0) + QT_DEPRECATED_X("Use QMediaContent::request().url()") QUrl canonicalUrl() const; + QT_DEPRECATED_X("Use QMediaContent::request()") QNetworkRequest canonicalRequest() const; QT_DEPRECATED QMediaResource canonicalResource() const; QT_DEPRECATED QMediaResourceList resources() const; #endif diff --git a/src/multimedia/playback/qmediaplayer.cpp b/src/multimedia/playback/qmediaplayer.cpp index 6f8cbd6ed..48db0335e 100644 --- a/src/multimedia/playback/qmediaplayer.cpp +++ b/src/multimedia/playback/qmediaplayer.cpp @@ -183,7 +183,7 @@ bool QMediaPlayerPrivate::isInChain(const QUrl &url) // Check whether a URL is already in the chain of playlists. // Also see a comment in parentPlaylist(). for (QMediaPlaylist *current = rootMedia.playlist(); current && current != playlist; current = current->currentMedia().playlist()) - if (current->currentMedia().canonicalUrl() == url) { + if (current->currentMedia().request().url() == url) { return true; } return false; @@ -345,10 +345,10 @@ void QMediaPlayerPrivate::setMedia(const QMediaContent &media, QIODevice *stream // Backends can't play qrc files directly. // If the backend supports StreamPlayback, we pass a QFile for that resource. // If it doesn't, we copy the data to a temporary file and pass its path. - if (!media.isNull() && !stream && media.canonicalUrl().scheme() == QLatin1String("qrc")) { + if (!media.isNull() && !stream && media.request().url().scheme() == QLatin1String("qrc")) { qrcMedia = media; - file.reset(new QFile(QLatin1Char(':') + media.canonicalUrl().path())); + file.reset(new QFile(QLatin1Char(':') + media.request().url().path())); if (!file->open(QFile::ReadOnly)) { QMetaObject::invokeMethod(q, "_q_error", Qt::QueuedConnection, Q_ARG(int, QMediaPlayer::ResourceError), @@ -464,11 +464,14 @@ void QMediaPlayerPrivate::loadPlaylist() // Do not load a playlist if there are more than MAX_NESTED_PLAYLISTS in the chain already, // or if the playlist URL is already in the chain, i.e. do not allow recursive playlists and loops. - if (nestedPlaylists < MAX_NESTED_PLAYLISTS && !q->currentMedia().canonicalUrl().isEmpty() && !isInChain(q->currentMedia().canonicalUrl())) { - pendingPlaylist = QMediaContent(new QMediaPlaylist, q->currentMedia().canonicalUrl(), true); + if (nestedPlaylists < MAX_NESTED_PLAYLISTS + && !q->currentMedia().request().url().isEmpty() + && !isInChain(q->currentMedia().request().url())) + { + pendingPlaylist = QMediaContent(new QMediaPlaylist, q->currentMedia().request().url(), true); QObject::connect(pendingPlaylist.playlist(), SIGNAL(loaded()), q, SLOT(_q_handlePlaylistLoaded())); QObject::connect(pendingPlaylist.playlist(), SIGNAL(loadFailed()), q, SLOT(_q_handlePlaylistLoadFailed())); - pendingPlaylist.playlist()->load(pendingPlaylist.canonicalRequest()); + pendingPlaylist.playlist()->load(pendingPlaylist.request()); } else if (playlist) { playlist->next(); } diff --git a/src/multimedia/playback/qplaylistfileparser.cpp b/src/multimedia/playback/qplaylistfileparser.cpp index 92e7f97e8..9af447032 100644 --- a/src/multimedia/playback/qplaylistfileparser.cpp +++ b/src/multimedia/playback/qplaylistfileparser.cpp @@ -504,7 +504,7 @@ void QPlaylistFileParser::start(const QMediaContent &media, QIODevice *stream, c if (stream) start(stream, mimeType); else - start(media.canonicalRequest(), mimeType); + start(media.request(), mimeType); } void QPlaylistFileParser::start(QIODevice *stream, const QString &mimeType) diff --git a/src/multimedia/qmediaobject.cpp b/src/multimedia/qmediaobject.cpp index ec2bebb34..a26433c8e 100644 --- a/src/multimedia/qmediaobject.cpp +++ b/src/multimedia/qmediaobject.cpp @@ -113,7 +113,6 @@ void QMediaObjectPrivate::_q_availabilityChanged() QMediaObject::~QMediaObject() { - delete d_ptr; } /*! @@ -230,15 +229,11 @@ void QMediaObject::unbind(QObject *object) constructor is protected. */ -QMediaObject::QMediaObject(QObject *parent, QMediaService *service): - QObject(parent), - d_ptr(new QMediaObjectPrivate) - +QMediaObject::QMediaObject(QObject *parent, QMediaService *service) + : QObject(*new QMediaObjectPrivate, parent) { Q_D(QMediaObject); - d->q_ptr = this; - d->notifyTimer = new QTimer(this); d->notifyTimer->setInterval(1000); connect(d->notifyTimer, SIGNAL(timeout()), SLOT(_q_notify())); @@ -252,13 +247,10 @@ QMediaObject::QMediaObject(QObject *parent, QMediaService *service): \internal */ -QMediaObject::QMediaObject(QMediaObjectPrivate &dd, QObject *parent, - QMediaService *service): - QObject(parent), - d_ptr(&dd) +QMediaObject::QMediaObject(QMediaObjectPrivate &dd, QObject *parent, QMediaService *service) + : QObject(dd, parent) { Q_D(QMediaObject); - d->q_ptr = this; d->notifyTimer = new QTimer(this); d->notifyTimer->setInterval(1000); diff --git a/src/multimedia/qmediaobject.h b/src/multimedia/qmediaobject.h index 5788254b8..fabd015fe 100644 --- a/src/multimedia/qmediaobject.h +++ b/src/multimedia/qmediaobject.h @@ -93,7 +93,9 @@ protected: void addPropertyWatch(QByteArray const &name); void removePropertyWatch(QByteArray const &name); - QMediaObjectPrivate *d_ptr; +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) + QMediaObjectPrivate *d_ptr_deprecated; +#endif private: void setupControls(); diff --git a/src/multimedia/qmediaobject_p.h b/src/multimedia/qmediaobject_p.h index 85caf9a50..5067fa6d1 100644 --- a/src/multimedia/qmediaobject_p.h +++ b/src/multimedia/qmediaobject_p.h @@ -56,6 +56,7 @@ #include <QtCore/qtimer.h> #include "qmediaobject.h" +#include "private/qobject_p.h" QT_BEGIN_NAMESPACE @@ -68,12 +69,12 @@ class QMediaAvailabilityControl; friend class Class; -class QMediaObjectPrivate +class QMediaObjectPrivate : public QObjectPrivate { Q_DECLARE_PUBLIC(QMediaObject) public: - QMediaObjectPrivate() : service(nullptr), metaDataControl(nullptr), availabilityControl(nullptr), notifyTimer(nullptr), q_ptr(nullptr) {} + QMediaObjectPrivate() : service(nullptr), metaDataControl(nullptr), availabilityControl(nullptr), notifyTimer(nullptr) {} virtual ~QMediaObjectPrivate() {} void _q_notify(); @@ -85,8 +86,6 @@ public: QTimer* notifyTimer; QSet<int> notifyProperties; - - QMediaObject *q_ptr; }; QT_END_NAMESPACE diff --git a/src/multimedia/qmediaservice.cpp b/src/multimedia/qmediaservice.cpp index 7580ecce7..7ea24c6dc 100644 --- a/src/multimedia/qmediaservice.cpp +++ b/src/multimedia/qmediaservice.cpp @@ -87,20 +87,16 @@ QT_BEGIN_NAMESPACE */ QMediaService::QMediaService(QObject *parent) - : QObject(parent) - , d_ptr(new QMediaServicePrivate) + : QObject(*new QMediaServicePrivate, parent) { - d_ptr->q_ptr = this; } /*! \internal */ QMediaService::QMediaService(QMediaServicePrivate &dd, QObject *parent) - : QObject(parent) - , d_ptr(&dd) + : QObject(dd, parent) { - d_ptr->q_ptr = this; } /*! @@ -109,7 +105,6 @@ QMediaService::QMediaService(QMediaServicePrivate &dd, QObject *parent) QMediaService::~QMediaService() { - delete d_ptr; } /*! diff --git a/src/multimedia/qmediaservice.h b/src/multimedia/qmediaservice.h index 9e653b2d8..019b86693 100644 --- a/src/multimedia/qmediaservice.h +++ b/src/multimedia/qmediaservice.h @@ -74,7 +74,9 @@ protected: QMediaService(QObject* parent); QMediaService(QMediaServicePrivate &dd, QObject *parent); - QMediaServicePrivate *d_ptr; +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) + QMediaServicePrivate *d_ptr_deprecated; +#endif private: Q_DECLARE_PRIVATE(QMediaService) diff --git a/src/multimedia/qmediaservice_p.h b/src/multimedia/qmediaservice_p.h index 8c18ab1df..a9dbd5d29 100644 --- a/src/multimedia/qmediaservice_p.h +++ b/src/multimedia/qmediaservice_p.h @@ -51,18 +51,19 @@ // We mean it. // +#include "private/qobject_p.h" + QT_BEGIN_NAMESPACE class QAudioDeviceControl; -class QMediaServicePrivate +class QMediaServicePrivate : public QObjectPrivate { + Q_DECLARE_PUBLIC(QMediaService) public: - QMediaServicePrivate(): q_ptr(0) {} + QMediaServicePrivate() {} virtual ~QMediaServicePrivate() {} - - QMediaService *q_ptr; }; QT_END_NAMESPACE diff --git a/src/multimedia/qmediaserviceprovider.cpp b/src/multimedia/qmediaserviceprovider.cpp index af09c406f..5731cf5be 100644 --- a/src/multimedia/qmediaserviceprovider.cpp +++ b/src/multimedia/qmediaserviceprovider.cpp @@ -85,6 +85,7 @@ public: /*! \class QMediaServiceProviderHint + \obsolete \brief The QMediaServiceProviderHint class describes what is required of a QMediaService. @@ -670,6 +671,7 @@ Q_GLOBAL_STATIC(QPluginServiceProvider, pluginProvider); /*! \class QMediaServiceProvider + \obsolete \ingroup multimedia \ingroup multimedia_control \ingroup multimedia_core @@ -827,6 +829,7 @@ QMediaServiceProvider *QMediaServiceProvider::defaultServiceProvider() /*! \class QMediaServiceProviderPlugin + \obsolete \inmodule QtMultimedia \brief The QMediaServiceProviderPlugin class interface provides an interface for QMediaService plug-ins. @@ -854,6 +857,7 @@ QMediaServiceProvider *QMediaServiceProvider::defaultServiceProvider() /*! \class QMediaServiceSupportedFormatsInterface + \obsolete \inmodule QtMultimedia \brief The QMediaServiceSupportedFormatsInterface class interface identifies if a media service plug-in supports a media format. @@ -882,6 +886,7 @@ QMediaServiceProvider *QMediaServiceProvider::defaultServiceProvider() /*! \class QMediaServiceSupportedDevicesInterface + \obsolete \inmodule QtMultimedia \brief The QMediaServiceSupportedDevicesInterface class interface identifies the devices supported by a media service plug-in. @@ -909,6 +914,7 @@ QMediaServiceProvider *QMediaServiceProvider::defaultServiceProvider() /*! \class QMediaServiceDefaultDeviceInterface + \obsolete \inmodule QtMultimedia \brief The QMediaServiceDefaultDeviceInterface class interface identifies the default device used by a media service plug-in. @@ -932,6 +938,7 @@ QMediaServiceProvider *QMediaServiceProvider::defaultServiceProvider() /*! \class QMediaServiceCameraInfoInterface + \obsolete \inmodule QtMultimedia \since 5.3 \brief The QMediaServiceCameraInfoInterface class interface @@ -961,6 +968,7 @@ QMediaServiceProvider *QMediaServiceProvider::defaultServiceProvider() /*! \class QMediaServiceFeaturesInterface + \obsolete \inmodule QtMultimedia \brief The QMediaServiceFeaturesInterface class interface identifies features supported by a media service plug-in. diff --git a/src/multimedia/qmediatimerange.cpp b/src/multimedia/qmediatimerange.cpp index 676d3d391..3a22e000f 100644 --- a/src/multimedia/qmediatimerange.cpp +++ b/src/multimedia/qmediatimerange.cpp @@ -94,6 +94,7 @@ QMediaTimeInterval::QMediaTimeInterval(qint64 start, qint64 end) } +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) /*! \fn QMediaTimeInterval::QMediaTimeInterval(const QMediaTimeInterval &other) @@ -105,6 +106,7 @@ QMediaTimeInterval::QMediaTimeInterval(const QMediaTimeInterval &other) { } +#endif /*! \fn QMediaTimeInterval::start() const diff --git a/src/multimedia/qmediatimerange.h b/src/multimedia/qmediatimerange.h index 5b6d711af..71145adde 100644 --- a/src/multimedia/qmediatimerange.h +++ b/src/multimedia/qmediatimerange.h @@ -54,8 +54,12 @@ class Q_MULTIMEDIA_EXPORT QMediaTimeInterval public: QMediaTimeInterval(); QMediaTimeInterval(qint64 start, qint64 end); +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) QMediaTimeInterval(const QMediaTimeInterval&); QMediaTimeInterval &operator=(const QMediaTimeInterval&) = default; + QMediaTimeInterval(QMediaTimeInterval &&) = default; + QMediaTimeInterval &operator=(QMediaTimeInterval &&) = default; +#endif qint64 start() const; qint64 end() const; diff --git a/src/multimedia/radio/qradiodata.cpp b/src/multimedia/radio/qradiodata.cpp index 4c824a4f8..c795cf389 100644 --- a/src/multimedia/radio/qradiodata.cpp +++ b/src/multimedia/radio/qradiodata.cpp @@ -59,6 +59,7 @@ Q_CONSTRUCTOR_FUNCTION(qRegisterRadioDataMetaTypes) /*! \class QRadioData + \obsolete \brief The QRadioData class provides interfaces to the RDS functionality of the system radio. \inmodule QtMultimedia diff --git a/src/multimedia/radio/qradiotuner.cpp b/src/multimedia/radio/qradiotuner.cpp index 2af0d0f02..ea7fb35f5 100644 --- a/src/multimedia/radio/qradiotuner.cpp +++ b/src/multimedia/radio/qradiotuner.cpp @@ -64,6 +64,7 @@ Q_CONSTRUCTOR_FUNCTION(qRegisterRadioTunerMetaTypes) /*! \class QRadioTuner + \obsolete \brief The QRadioTuner class provides an interface to the systems analog radio device. \inmodule QtMultimedia diff --git a/src/multimedia/video/qvideoframe.cpp b/src/multimedia/video/qvideoframe.cpp index b466a3180..5e2d6df39 100644 --- a/src/multimedia/video/qvideoframe.cpp +++ b/src/multimedia/video/qvideoframe.cpp @@ -227,6 +227,11 @@ private: horizontally and vertically sub-sampled, i.e. the height and width of the U and V planes are half that of the Y plane. + \value Format_YUV422P + The frame is stored using an 8-bit per component planar YUV format with the U and V planes + horizontally sub-sampled, i.e. the width of the U and V planes are + half that of the Y plane, and height of U and V planes is the same as Y. + \value Format_YV12 The frame is stored using an 8-bit per component planar YVU format with the V and U planes horizontally and vertically sub-sampled, i.e. the height and width of the V and U planes are @@ -638,6 +643,7 @@ bool QVideoFrame::map(QAbstractVideoBuffer::MapMode mode) // Single plane or opaque format. break; case Format_YUV420P: + case Format_YUV422P: case Format_YV12: { // The UV stride is usually half the Y stride and is 32-bit aligned. // However it's not always the case, at least on Windows where the @@ -646,13 +652,14 @@ bool QVideoFrame::map(QAbstractVideoBuffer::MapMode mode) // have a correct stride. const int height = d->size.height(); const int yStride = d->bytesPerLine[0]; - const int uvStride = (d->mappedBytes - (yStride * height)) / height; + const int uvHeight = d->pixelFormat == Format_YUV422P ? height : height / 2; + const int uvStride = (d->mappedBytes - (yStride * height)) / uvHeight / 2; - // Three planes, the second and third vertically and horizontally subsampled. + // Three planes, the second and third vertically (and horizontally for other than Format_YUV422P formats) subsampled. d->planeCount = 3; d->bytesPerLine[2] = d->bytesPerLine[1] = uvStride; d->data[1] = d->data[0] + (yStride * height); - d->data[2] = d->data[1] + (uvStride * height / 2); + d->data[2] = d->data[1] + (uvStride * uvHeight); break; } case Format_NV12: @@ -1001,6 +1008,7 @@ QImage::Format QVideoFrame::imageFormatFromPixelFormat(PixelFormat format) case Format_AYUV444_Premultiplied: case Format_YUV444: case Format_YUV420P: + case Format_YUV422P: case Format_YV12: case Format_UYVY: case Format_YUYV: @@ -1072,7 +1080,7 @@ static VideoFrameConvertFunc qConvertFuncs[QVideoFrame::NPixelFormats] = { /* Format_CameraRaw */ nullptr, /* Format_AdobeDng */ nullptr, /* Format_ABGR32 */ nullptr, // ### Qt 6: reorder - + /* Format_YUV422P */ nullptr, }; static void qInitConvertFuncsAsm() @@ -1192,6 +1200,8 @@ QDebug operator<<(QDebug dbg, QVideoFrame::PixelFormat pf) return dbg << "Format_YUV444"; case QVideoFrame::Format_YUV420P: return dbg << "Format_YUV420P"; + case QVideoFrame::Format_YUV422P: + return dbg << "Format_YUV422P"; case QVideoFrame::Format_YV12: return dbg << "Format_YV12"; case QVideoFrame::Format_UYVY: diff --git a/src/multimedia/video/qvideoframe.h b/src/multimedia/video/qvideoframe.h index 206658bc5..8fcf47fc4 100644 --- a/src/multimedia/video/qvideoframe.h +++ b/src/multimedia/video/qvideoframe.h @@ -102,6 +102,7 @@ public: Format_CameraRaw, Format_AdobeDng, Format_ABGR32, // ### Qt 6: reorder + Format_YUV422P, #ifndef Q_QDOC NPixelFormats, diff --git a/src/multimedia/video/qvideosurfaceformat.cpp b/src/multimedia/video/qvideosurfaceformat.cpp index 7a703c260..77ea276c7 100644 --- a/src/multimedia/video/qvideosurfaceformat.cpp +++ b/src/multimedia/video/qvideosurfaceformat.cpp @@ -519,9 +519,9 @@ QList<QByteArray> QVideoSurfaceFormat::propertyNames() const QVariant QVideoSurfaceFormat::property(const char *name) const { if (qstrcmp(name, "handleType") == 0) { - return qVariantFromValue(d->handleType); + return QVariant::fromValue(d->handleType); } else if (qstrcmp(name, "pixelFormat") == 0) { - return qVariantFromValue(d->pixelFormat); + return QVariant::fromValue(d->pixelFormat); } else if (qstrcmp(name, "frameSize") == 0) { return d->frameSize; } else if (qstrcmp(name, "frameWidth") == 0) { @@ -531,15 +531,15 @@ QVariant QVideoSurfaceFormat::property(const char *name) const } else if (qstrcmp(name, "viewport") == 0) { return d->viewport; } else if (qstrcmp(name, "scanLineDirection") == 0) { - return qVariantFromValue(d->scanLineDirection); + return QVariant::fromValue(d->scanLineDirection); } else if (qstrcmp(name, "frameRate") == 0) { - return qVariantFromValue(d->frameRate); + return QVariant::fromValue(d->frameRate); } else if (qstrcmp(name, "pixelAspectRatio") == 0) { - return qVariantFromValue(d->pixelAspectRatio); + return QVariant::fromValue(d->pixelAspectRatio); } else if (qstrcmp(name, "sizeHint") == 0) { return sizeHint(); } else if (qstrcmp(name, "yCbCrColorSpace") == 0) { - return qVariantFromValue(d->ycbcrColorSpace); + return QVariant::fromValue(d->ycbcrColorSpace); } else if (qstrcmp(name, "mirrored") == 0) { return d->mirrored; } else { diff --git a/src/multimediawidgets/qvideowidget.cpp b/src/multimediawidgets/qvideowidget.cpp index bae0efd22..a7d3665f8 100644 --- a/src/multimediawidgets/qvideowidget.cpp +++ b/src/multimediawidgets/qvideowidget.cpp @@ -77,7 +77,7 @@ QVideoWidgetControlBackend::QVideoWidgetControlBackend( connect(control, SIGNAL(fullScreenChanged(bool)), widget, SLOT(_q_fullScreenChanged(bool))); QBoxLayout *layout = new QVBoxLayout; - layout->setMargin(0); + layout->setContentsMargins(0, 0, 0, 0); layout->setSpacing(0); QWidget *videoWidget = control->videoWidget(); @@ -1007,7 +1007,11 @@ void QVideoWidget::paintEvent(QPaintEvent *event) } #if defined(Q_OS_WIN) +# if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) +bool QVideoWidget::nativeEvent(const QByteArray &eventType, void *message, qintptr *result) +# else bool QVideoWidget::nativeEvent(const QByteArray &eventType, void *message, long *result) +# endif { Q_D(QVideoWidget); Q_UNUSED(eventType); diff --git a/src/multimediawidgets/qvideowidget.h b/src/multimediawidgets/qvideowidget.h index 2a08b6fbd..fff1153ca 100644 --- a/src/multimediawidgets/qvideowidget.h +++ b/src/multimediawidgets/qvideowidget.h @@ -82,7 +82,11 @@ public: QSize sizeHint() const override; #if defined(Q_OS_WIN) +# if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + bool nativeEvent(const QByteArray &eventType, void *message, qintptr *result) override; +# else bool nativeEvent(const QByteArray &eventType, void *message, long *result) override; +# endif #endif public Q_SLOTS: diff --git a/src/plugins/alsa/qalsaaudiodeviceinfo.cpp b/src/plugins/alsa/qalsaaudiodeviceinfo.cpp index 5e8edc3fc..474fd6bde 100644 --- a/src/plugins/alsa/qalsaaudiodeviceinfo.cpp +++ b/src/plugins/alsa/qalsaaudiodeviceinfo.cpp @@ -54,7 +54,7 @@ QT_BEGIN_NAMESPACE -QAlsaAudioDeviceInfo::QAlsaAudioDeviceInfo(QByteArray dev, QAudio::Mode mode) +QAlsaAudioDeviceInfo::QAlsaAudioDeviceInfo(const QByteArray &dev, QAudio::Mode mode) { handle = 0; diff --git a/src/plugins/alsa/qalsaaudiodeviceinfo.h b/src/plugins/alsa/qalsaaudiodeviceinfo.h index 21e30f49b..65675df54 100644 --- a/src/plugins/alsa/qalsaaudiodeviceinfo.h +++ b/src/plugins/alsa/qalsaaudiodeviceinfo.h @@ -74,7 +74,7 @@ class QAlsaAudioDeviceInfo : public QAbstractAudioDeviceInfo { Q_OBJECT public: - QAlsaAudioDeviceInfo(QByteArray dev,QAudio::Mode mode); + QAlsaAudioDeviceInfo(const QByteArray &dev,QAudio::Mode mode); ~QAlsaAudioDeviceInfo(); bool testSettings(const QAudioFormat& format) const; diff --git a/src/plugins/alsa/qalsaaudioinput.h b/src/plugins/alsa/qalsaaudioinput.h index 09f615fea..fa9c954d7 100644 --- a/src/plugins/alsa/qalsaaudioinput.h +++ b/src/plugins/alsa/qalsaaudioinput.h @@ -59,7 +59,7 @@ #include <QtCore/qtimer.h> #include <QtCore/qstring.h> #include <QtCore/qstringlist.h> -#include <QtCore/qdatetime.h> +#include <QtCore/qelapsedtimer.h> #include <QtCore/qiodevice.h> #include <QtMultimedia/qaudio.h> @@ -144,8 +144,8 @@ private: void drain(); QTimer* timer; - QTime timeStamp; - QTime clockStamp; + QElapsedTimer timeStamp; + QElapsedTimer clockStamp; qint64 elapsedTimeOffset; int intervalTime; RingBuffer ringBuffer; diff --git a/src/plugins/alsa/qalsaaudiooutput.h b/src/plugins/alsa/qalsaaudiooutput.h index d38e3d5d4..8002322cb 100644 --- a/src/plugins/alsa/qalsaaudiooutput.h +++ b/src/plugins/alsa/qalsaaudiooutput.h @@ -58,7 +58,7 @@ #include <QtCore/qtimer.h> #include <QtCore/qstring.h> #include <QtCore/qstringlist.h> -#include <QtCore/qdatetime.h> +#include <QtCore/qelapsedtimer.h> #include <QtCore/qiodevice.h> #include <QtMultimedia/qaudio.h> @@ -132,8 +132,8 @@ private: QTimer* timer; QByteArray m_device; int bytesAvailable; - QTime timeStamp; - QTime clockStamp; + QElapsedTimer timeStamp; + QElapsedTimer clockStamp; qint64 elapsedTimeOffset; char* audioBuffer; snd_pcm_t* handle; diff --git a/src/plugins/android/src/common/qandroidvideooutput.cpp b/src/plugins/android/src/common/qandroidvideooutput.cpp index 083ceff24..25e67e865 100644 --- a/src/plugins/android/src/common/qandroidvideooutput.cpp +++ b/src/plugins/android/src/common/qandroidvideooutput.cpp @@ -110,7 +110,7 @@ public: m_image = m_output->m_fbo->toImage(); if (numBytes) - *numBytes = m_image.byteCount(); + *numBytes = static_cast<int>(m_image.sizeInBytes()); if (bytesPerLine) *bytesPerLine = m_image.bytesPerLine(); diff --git a/src/plugins/android/src/mediaplayer/qandroidmediaplayercontrol.cpp b/src/plugins/android/src/mediaplayer/qandroidmediaplayercontrol.cpp index 13a8cdbbb..82250b654 100644 --- a/src/plugins/android/src/mediaplayer/qandroidmediaplayercontrol.cpp +++ b/src/plugins/android/src/mediaplayer/qandroidmediaplayercontrol.cpp @@ -384,7 +384,7 @@ void QAndroidMediaPlayerControl::setMedia(const QMediaContent &mediaContent, if ((mMediaPlayer->display() == 0) && mVideoOutput) mMediaPlayer->setDisplay(mVideoOutput->surfaceTexture()); - mMediaPlayer->setDataSource(mediaContent.canonicalRequest()); + mMediaPlayer->setDataSource(mediaContent.request()); mMediaPlayer->prepareAsync(); } diff --git a/src/plugins/android/src/mediaplayer/qandroidmetadatareadercontrol.cpp b/src/plugins/android/src/mediaplayer/qandroidmetadatareadercontrol.cpp index 1185e63dc..ef86af896 100644 --- a/src/plugins/android/src/mediaplayer/qandroidmetadatareadercontrol.cpp +++ b/src/plugins/android/src/mediaplayer/qandroidmetadatareadercontrol.cpp @@ -126,7 +126,7 @@ void QAndroidMetaDataReaderControl::onUpdateMetaData() if (m_mediaContent.isNull()) return; - const QUrl &url = m_mediaContent.canonicalUrl(); + const QUrl &url = m_mediaContent.request().url(); QtConcurrent::run(&extractMetadata, this, url); } @@ -134,7 +134,7 @@ void QAndroidMetaDataReaderControl::updateData(const QVariantMap &metadata, cons { const QMutexLocker l(&m_mtx); - if (m_mediaContent.canonicalUrl() != url) + if (m_mediaContent.request().url() != url) return; const bool oldAvailable = m_available; diff --git a/src/plugins/android/src/wrappers/jni/androidcamera.cpp b/src/plugins/android/src/wrappers/jni/androidcamera.cpp index 90af0119a..2f32fb742 100644 --- a/src/plugins/android/src/wrappers/jni/androidcamera.cpp +++ b/src/plugins/android/src/wrappers/jni/androidcamera.cpp @@ -52,6 +52,8 @@ #include <QtCore/qmutex.h> #include <QtMultimedia/private/qmemoryvideobuffer_p.h> +#include <mutex> + QT_BEGIN_NAMESPACE static const char QtCameraListenerClassName[] = "org/qtproject/qt5/android/multimedia/QtCameraListener"; @@ -263,7 +265,7 @@ public: Q_INVOKABLE QStringList callParametersStringListMethod(const QByteArray &methodName); int m_cameraId; - QMutex m_parametersMutex; + QRecursiveMutex m_parametersMutex; QSize m_previewSize; int m_rotation; QJNIObjectPrivate m_info; @@ -823,8 +825,7 @@ void AndroidCamera::stopPreviewSynchronous() } AndroidCameraPrivate::AndroidCameraPrivate() - : QObject(), - m_parametersMutex(QMutex::Recursive) + : QObject() { } @@ -911,7 +912,7 @@ int AndroidCameraPrivate::getNativeOrientation() QSize AndroidCameraPrivate::getPreferredPreviewSizeForVideo() { - QMutexLocker parametersLocker(&m_parametersMutex); + const std::lock_guard<QRecursiveMutex> locker(m_parametersMutex); if (!m_parameters.isValid()) return QSize(); @@ -929,7 +930,7 @@ QList<QSize> AndroidCameraPrivate::getSupportedPreviewSizes() { QList<QSize> list; - QMutexLocker parametersLocker(&m_parametersMutex); + const std::lock_guard<QRecursiveMutex> locker(m_parametersMutex); if (m_parameters.isValid()) { QJNIObjectPrivate sizeList = m_parameters.callObjectMethod("getSupportedPreviewSizes", @@ -942,7 +943,7 @@ QList<QSize> AndroidCameraPrivate::getSupportedPreviewSizes() list.append(QSize(size.getField<jint>("width"), size.getField<jint>("height"))); } - qSort(list.begin(), list.end(), qt_sizeLessThan); + std::sort(list.begin(), list.end(), qt_sizeLessThan); } return list; @@ -950,7 +951,7 @@ QList<QSize> AndroidCameraPrivate::getSupportedPreviewSizes() QList<AndroidCamera::FpsRange> AndroidCameraPrivate::getSupportedPreviewFpsRange() { - QMutexLocker parametersLocker(&m_parametersMutex); + const std::lock_guard<QRecursiveMutex> locker(m_parametersMutex); QJNIEnvironmentPrivate env; @@ -987,7 +988,7 @@ QList<AndroidCamera::FpsRange> AndroidCameraPrivate::getSupportedPreviewFpsRange AndroidCamera::FpsRange AndroidCameraPrivate::getPreviewFpsRange() { - QMutexLocker parametersLocker(&m_parametersMutex); + const std::lock_guard<QRecursiveMutex> locker(m_parametersMutex); QJNIEnvironmentPrivate env; @@ -1012,7 +1013,7 @@ AndroidCamera::FpsRange AndroidCameraPrivate::getPreviewFpsRange() void AndroidCameraPrivate::setPreviewFpsRange(int min, int max) { - QMutexLocker parametersLocker(&m_parametersMutex); + const std::lock_guard<QRecursiveMutex> locker(m_parametersMutex); if (!m_parameters.isValid()) return; @@ -1024,7 +1025,7 @@ void AndroidCameraPrivate::setPreviewFpsRange(int min, int max) AndroidCamera::ImageFormat AndroidCameraPrivate::getPreviewFormat() { - QMutexLocker parametersLocker(&m_parametersMutex); + const std::lock_guard<QRecursiveMutex> locker(m_parametersMutex); if (!m_parameters.isValid()) return AndroidCamera::UnknownImageFormat; @@ -1034,7 +1035,7 @@ AndroidCamera::ImageFormat AndroidCameraPrivate::getPreviewFormat() void AndroidCameraPrivate::setPreviewFormat(AndroidCamera::ImageFormat fmt) { - QMutexLocker parametersLocker(&m_parametersMutex); + const std::lock_guard<QRecursiveMutex> locker(m_parametersMutex); if (!m_parameters.isValid()) return; @@ -1047,7 +1048,7 @@ QList<AndroidCamera::ImageFormat> AndroidCameraPrivate::getSupportedPreviewForma { QList<AndroidCamera::ImageFormat> list; - QMutexLocker parametersLocker(&m_parametersMutex); + const std::lock_guard<QRecursiveMutex> locker(m_parametersMutex); if (m_parameters.isValid()) { QJNIObjectPrivate formatList = m_parameters.callObjectMethod("getSupportedPreviewFormats", @@ -1066,7 +1067,7 @@ QList<AndroidCamera::ImageFormat> AndroidCameraPrivate::getSupportedPreviewForma QSize AndroidCameraPrivate::getPreviewSize() { - QMutexLocker parametersLocker(&m_parametersMutex); + const std::lock_guard<QRecursiveMutex> locker(m_parametersMutex); if (!m_parameters.isValid()) return QSize(); @@ -1082,7 +1083,7 @@ QSize AndroidCameraPrivate::getPreviewSize() void AndroidCameraPrivate::updatePreviewSize() { - QMutexLocker parametersLocker(&m_parametersMutex); + const std::lock_guard<QRecursiveMutex> locker(m_parametersMutex); if (m_previewSize.isValid()) { m_parameters.callMethod<void>("setPreviewSize", "(II)V", m_previewSize.width(), m_previewSize.height()); @@ -1117,7 +1118,7 @@ void AndroidCameraPrivate::setDisplayOrientation(int degrees) bool AndroidCameraPrivate::isZoomSupported() { - QMutexLocker parametersLocker(&m_parametersMutex); + const std::lock_guard<QRecursiveMutex> locker(m_parametersMutex); if (!m_parameters.isValid()) return false; @@ -1127,7 +1128,7 @@ bool AndroidCameraPrivate::isZoomSupported() int AndroidCameraPrivate::getMaxZoom() { - QMutexLocker parametersLocker(&m_parametersMutex); + const std::lock_guard<QRecursiveMutex> locker(m_parametersMutex); if (!m_parameters.isValid()) return 0; @@ -1137,7 +1138,7 @@ int AndroidCameraPrivate::getMaxZoom() QList<int> AndroidCameraPrivate::getZoomRatios() { - QMutexLocker parametersLocker(&m_parametersMutex); + const std::lock_guard<QRecursiveMutex> locker(m_parametersMutex); QList<int> ratios; @@ -1159,7 +1160,7 @@ QList<int> AndroidCameraPrivate::getZoomRatios() int AndroidCameraPrivate::getZoom() { - QMutexLocker parametersLocker(&m_parametersMutex); + const std::lock_guard<QRecursiveMutex> locker(m_parametersMutex); if (!m_parameters.isValid()) return 0; @@ -1169,7 +1170,7 @@ int AndroidCameraPrivate::getZoom() void AndroidCameraPrivate::setZoom(int value) { - QMutexLocker parametersLocker(&m_parametersMutex); + const std::lock_guard<QRecursiveMutex> locker(m_parametersMutex); if (!m_parameters.isValid()) return; @@ -1180,7 +1181,7 @@ void AndroidCameraPrivate::setZoom(int value) QString AndroidCameraPrivate::getFlashMode() { - QMutexLocker parametersLocker(&m_parametersMutex); + const std::lock_guard<QRecursiveMutex> locker(m_parametersMutex); QString value; @@ -1196,7 +1197,7 @@ QString AndroidCameraPrivate::getFlashMode() void AndroidCameraPrivate::setFlashMode(const QString &value) { - QMutexLocker parametersLocker(&m_parametersMutex); + const std::lock_guard<QRecursiveMutex> locker(m_parametersMutex); if (!m_parameters.isValid()) return; @@ -1209,7 +1210,7 @@ void AndroidCameraPrivate::setFlashMode(const QString &value) QString AndroidCameraPrivate::getFocusMode() { - QMutexLocker parametersLocker(&m_parametersMutex); + const std::lock_guard<QRecursiveMutex> locker(m_parametersMutex); QString value; @@ -1225,7 +1226,7 @@ QString AndroidCameraPrivate::getFocusMode() void AndroidCameraPrivate::setFocusMode(const QString &value) { - QMutexLocker parametersLocker(&m_parametersMutex); + const std::lock_guard<QRecursiveMutex> locker(m_parametersMutex); if (!m_parameters.isValid()) return; @@ -1241,7 +1242,7 @@ int AndroidCameraPrivate::getMaxNumFocusAreas() if (QtAndroidPrivate::androidSdkVersion() < 14) return 0; - QMutexLocker parametersLocker(&m_parametersMutex); + const std::lock_guard<QRecursiveMutex> locker(m_parametersMutex); if (!m_parameters.isValid()) return 0; @@ -1256,7 +1257,7 @@ QList<QRect> AndroidCameraPrivate::getFocusAreas() if (QtAndroidPrivate::androidSdkVersion() < 14) return areas; - QMutexLocker parametersLocker(&m_parametersMutex); + const std::lock_guard<QRecursiveMutex> locker(m_parametersMutex); if (m_parameters.isValid()) { QJNIObjectPrivate list = m_parameters.callObjectMethod("getFocusAreas", @@ -1282,7 +1283,7 @@ void AndroidCameraPrivate::setFocusAreas(const QList<QRect> &areas) if (QtAndroidPrivate::androidSdkVersion() < 14) return; - QMutexLocker parametersLocker(&m_parametersMutex); + const std::lock_guard<QRecursiveMutex> locker(m_parametersMutex); if (!m_parameters.isValid()) return; @@ -1330,7 +1331,7 @@ bool AndroidCameraPrivate::isAutoExposureLockSupported() if (QtAndroidPrivate::androidSdkVersion() < 14) return false; - QMutexLocker parametersLocker(&m_parametersMutex); + const std::lock_guard<QRecursiveMutex> locker(m_parametersMutex); if (!m_parameters.isValid()) return false; @@ -1343,7 +1344,7 @@ bool AndroidCameraPrivate::getAutoExposureLock() if (QtAndroidPrivate::androidSdkVersion() < 14) return false; - QMutexLocker parametersLocker(&m_parametersMutex); + const std::lock_guard<QRecursiveMutex> locker(m_parametersMutex); if (!m_parameters.isValid()) return false; @@ -1356,7 +1357,7 @@ void AndroidCameraPrivate::setAutoExposureLock(bool toggle) if (QtAndroidPrivate::androidSdkVersion() < 14) return; - QMutexLocker parametersLocker(&m_parametersMutex); + const std::lock_guard<QRecursiveMutex> locker(m_parametersMutex); if (!m_parameters.isValid()) return; @@ -1370,7 +1371,7 @@ bool AndroidCameraPrivate::isAutoWhiteBalanceLockSupported() if (QtAndroidPrivate::androidSdkVersion() < 14) return false; - QMutexLocker parametersLocker(&m_parametersMutex); + const std::lock_guard<QRecursiveMutex> locker(m_parametersMutex); if (!m_parameters.isValid()) return false; @@ -1383,7 +1384,7 @@ bool AndroidCameraPrivate::getAutoWhiteBalanceLock() if (QtAndroidPrivate::androidSdkVersion() < 14) return false; - QMutexLocker parametersLocker(&m_parametersMutex); + const std::lock_guard<QRecursiveMutex> locker(m_parametersMutex); if (!m_parameters.isValid()) return false; @@ -1396,7 +1397,7 @@ void AndroidCameraPrivate::setAutoWhiteBalanceLock(bool toggle) if (QtAndroidPrivate::androidSdkVersion() < 14) return; - QMutexLocker parametersLocker(&m_parametersMutex); + const std::lock_guard<QRecursiveMutex> locker(m_parametersMutex); if (!m_parameters.isValid()) return; @@ -1407,7 +1408,7 @@ void AndroidCameraPrivate::setAutoWhiteBalanceLock(bool toggle) int AndroidCameraPrivate::getExposureCompensation() { - QMutexLocker parametersLocker(&m_parametersMutex); + const std::lock_guard<QRecursiveMutex> locker(m_parametersMutex); if (!m_parameters.isValid()) return 0; @@ -1417,7 +1418,7 @@ int AndroidCameraPrivate::getExposureCompensation() void AndroidCameraPrivate::setExposureCompensation(int value) { - QMutexLocker parametersLocker(&m_parametersMutex); + const std::lock_guard<QRecursiveMutex> locker(m_parametersMutex); if (!m_parameters.isValid()) return; @@ -1428,7 +1429,7 @@ void AndroidCameraPrivate::setExposureCompensation(int value) float AndroidCameraPrivate::getExposureCompensationStep() { - QMutexLocker parametersLocker(&m_parametersMutex); + const std::lock_guard<QRecursiveMutex> locker(m_parametersMutex); if (!m_parameters.isValid()) return 0; @@ -1438,7 +1439,7 @@ float AndroidCameraPrivate::getExposureCompensationStep() int AndroidCameraPrivate::getMinExposureCompensation() { - QMutexLocker parametersLocker(&m_parametersMutex); + const std::lock_guard<QRecursiveMutex> locker(m_parametersMutex); if (!m_parameters.isValid()) return 0; @@ -1448,7 +1449,7 @@ int AndroidCameraPrivate::getMinExposureCompensation() int AndroidCameraPrivate::getMaxExposureCompensation() { - QMutexLocker parametersLocker(&m_parametersMutex); + const std::lock_guard<QRecursiveMutex> locker(m_parametersMutex); if (!m_parameters.isValid()) return 0; @@ -1458,7 +1459,7 @@ int AndroidCameraPrivate::getMaxExposureCompensation() QString AndroidCameraPrivate::getSceneMode() { - QMutexLocker parametersLocker(&m_parametersMutex); + const std::lock_guard<QRecursiveMutex> locker(m_parametersMutex); QString value; @@ -1474,7 +1475,7 @@ QString AndroidCameraPrivate::getSceneMode() void AndroidCameraPrivate::setSceneMode(const QString &value) { - QMutexLocker parametersLocker(&m_parametersMutex); + const std::lock_guard<QRecursiveMutex> locker(m_parametersMutex); if (!m_parameters.isValid()) return; @@ -1487,7 +1488,7 @@ void AndroidCameraPrivate::setSceneMode(const QString &value) QString AndroidCameraPrivate::getWhiteBalance() { - QMutexLocker parametersLocker(&m_parametersMutex); + const std::lock_guard<QRecursiveMutex> locker(m_parametersMutex); QString value; @@ -1503,7 +1504,7 @@ QString AndroidCameraPrivate::getWhiteBalance() void AndroidCameraPrivate::setWhiteBalance(const QString &value) { - QMutexLocker parametersLocker(&m_parametersMutex); + const std::lock_guard<QRecursiveMutex> locker(m_parametersMutex); if (!m_parameters.isValid()) return; @@ -1518,7 +1519,7 @@ void AndroidCameraPrivate::setWhiteBalance(const QString &value) void AndroidCameraPrivate::updateRotation() { - QMutexLocker parametersLocker(&m_parametersMutex); + const std::lock_guard<QRecursiveMutex> locker(m_parametersMutex); m_parameters.callMethod<void>("setRotation", "(I)V", m_rotation); applyParameters(); @@ -1526,7 +1527,7 @@ void AndroidCameraPrivate::updateRotation() QList<QSize> AndroidCameraPrivate::getSupportedPictureSizes() { - QMutexLocker parametersLocker(&m_parametersMutex); + const std::lock_guard<QRecursiveMutex> locker(m_parametersMutex); QList<QSize> list; @@ -1541,7 +1542,7 @@ QList<QSize> AndroidCameraPrivate::getSupportedPictureSizes() list.append(QSize(size.getField<jint>("width"), size.getField<jint>("height"))); } - qSort(list.begin(), list.end(), qt_sizeLessThan); + std::sort(list.begin(), list.end(), qt_sizeLessThan); } return list; @@ -1549,7 +1550,7 @@ QList<QSize> AndroidCameraPrivate::getSupportedPictureSizes() void AndroidCameraPrivate::setPictureSize(const QSize &size) { - QMutexLocker parametersLocker(&m_parametersMutex); + const std::lock_guard<QRecursiveMutex> locker(m_parametersMutex); if (!m_parameters.isValid()) return; @@ -1560,7 +1561,7 @@ void AndroidCameraPrivate::setPictureSize(const QSize &size) void AndroidCameraPrivate::setJpegQuality(int quality) { - QMutexLocker parametersLocker(&m_parametersMutex); + const std::lock_guard<QRecursiveMutex> locker(m_parametersMutex); if (!m_parameters.isValid()) return; @@ -1669,7 +1670,7 @@ void AndroidCameraPrivate::applyParameters() QStringList AndroidCameraPrivate::callParametersStringListMethod(const QByteArray &methodName) { - QMutexLocker parametersLocker(&m_parametersMutex); + const std::lock_guard<QRecursiveMutex> locker(m_parametersMutex); QStringList stringList; diff --git a/src/plugins/avfoundation/camera/avfcamerasession.mm b/src/plugins/avfoundation/camera/avfcamerasession.mm index 8ed627774..a3263badc 100644 --- a/src/plugins/avfoundation/camera/avfcamerasession.mm +++ b/src/plugins/avfoundation/camera/avfcamerasession.mm @@ -234,7 +234,7 @@ void AVFCameraSession::updateCameraDevices() break; case AVCaptureDevicePositionFront: info.position = QCamera::FrontFace; - info.orientation = 90; + info.orientation = 270; break; default: info.position = QCamera::UnspecifiedPosition; diff --git a/src/plugins/avfoundation/camera/avfvideoencodersettingscontrol.mm b/src/plugins/avfoundation/camera/avfvideoencodersettingscontrol.mm index bbb16e709..ddf833fd3 100644 --- a/src/plugins/avfoundation/camera/avfvideoencodersettingscontrol.mm +++ b/src/plugins/avfoundation/camera/avfvideoencodersettingscontrol.mm @@ -76,7 +76,7 @@ static bool format_supports_framerate(AVCaptureDeviceFormat *format, qreal fps) static bool real_list_contains(const QList<qreal> &list, qreal value) { - Q_FOREACH (qreal r, list) { + for (qreal r : list) { if (qFuzzyCompare(r, value)) return true; } diff --git a/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm b/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm index 3b25a5801..3c59419e7 100644 --- a/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm +++ b/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm @@ -491,7 +491,7 @@ const QIODevice *AVFMediaPlayerSession::mediaStream() const void AVFMediaPlayerSession::setMedia(const QMediaContent &content, QIODevice *stream) { #ifdef QT_DEBUG_AVF - qDebug() << Q_FUNC_INFO << content.canonicalUrl(); + qDebug() << Q_FUNC_INFO << content.request().url(); #endif [static_cast<AVFMediaPlayerSessionObserver*>(m_observer) unloadMedia]; @@ -508,7 +508,7 @@ void AVFMediaPlayerSession::setMedia(const QMediaContent &content, QIODevice *st const QMediaPlayer::MediaStatus oldMediaStatus = m_mediaStatus; const QMediaPlayer::State oldState = m_state; - if (content.isNull() || content.canonicalUrl().isEmpty()) { + if (content.isNull() || content.request().url().isEmpty()) { m_mediaStatus = QMediaPlayer::NoMedia; if (m_mediaStatus != oldMediaStatus) Q_EMIT mediaStatusChanged(m_mediaStatus); @@ -526,7 +526,7 @@ void AVFMediaPlayerSession::setMedia(const QMediaContent &content, QIODevice *st //Load AVURLAsset //initialize asset using content's URL - NSString *urlString = [NSString stringWithUTF8String:content.canonicalUrl().toEncoded().constData()]; + NSString *urlString = [NSString stringWithUTF8String:content.request().url().toEncoded().constData()]; NSURL *url = [NSURL URLWithString:urlString]; [static_cast<AVFMediaPlayerSessionObserver*>(m_observer) setURL:url]; diff --git a/src/plugins/common/evr/evrcustompresenter.cpp b/src/plugins/common/evr/evrcustompresenter.cpp index 2bc761c45..b2dd0426c 100644 --- a/src/plugins/common/evr/evrcustompresenter.cpp +++ b/src/plugins/common/evr/evrcustompresenter.cpp @@ -50,6 +50,9 @@ #include <qcoreapplication.h> #include <qmath.h> #include <QtCore/qdebug.h> + +#include <mutex> + #include <float.h> #include <evcode.h> @@ -542,7 +545,6 @@ EVRCustomPresenter::EVRCustomPresenter(QAbstractVideoSurface *surface) , m_sampleFreeCB(this, &EVRCustomPresenter::onSampleFree) , m_refCount(1) , m_renderState(RenderShutdown) - , m_mutex(QMutex::Recursive) , m_scheduler(this) , m_tokenCounter(0) , m_sampleNotify(false) @@ -659,7 +661,7 @@ HRESULT EVRCustomPresenter::InitServicePointers(IMFTopologyServiceLookup *lookup HRESULT hr = S_OK; DWORD objectCount = 0; - QMutexLocker locker(&m_mutex); + const std::lock_guard<QRecursiveMutex> locker(m_mutex); // Do not allow initializing when playing or paused. if (isActive()) @@ -739,7 +741,7 @@ HRESULT EVRCustomPresenter::ProcessMessage(MFVP_MESSAGE_TYPE message, ULONG_PTR { HRESULT hr = S_OK; - QMutexLocker locker(&m_mutex); + const std::lock_guard<QRecursiveMutex> locker(m_mutex); hr = checkShutdown(); if (FAILED(hr)) @@ -806,7 +808,7 @@ HRESULT EVRCustomPresenter::GetCurrentMediaType(IMFVideoMediaType **mediaType) *mediaType = NULL; - QMutexLocker locker(&m_mutex); + const std::lock_guard<QRecursiveMutex> locker(m_mutex); hr = checkShutdown(); if (FAILED(hr)) @@ -820,7 +822,7 @@ HRESULT EVRCustomPresenter::GetCurrentMediaType(IMFVideoMediaType **mediaType) HRESULT EVRCustomPresenter::OnClockStart(MFTIME, LONGLONG clockStartOffset) { - QMutexLocker locker(&m_mutex); + const std::lock_guard<QRecursiveMutex> locker(m_mutex); // We cannot start after shutdown. HRESULT hr = checkShutdown(); @@ -855,7 +857,7 @@ HRESULT EVRCustomPresenter::OnClockStart(MFTIME, LONGLONG clockStartOffset) HRESULT EVRCustomPresenter::OnClockRestart(MFTIME) { - QMutexLocker locker(&m_mutex); + const std::lock_guard<QRecursiveMutex> locker(m_mutex); HRESULT hr = checkShutdown(); if (FAILED(hr)) @@ -879,7 +881,7 @@ HRESULT EVRCustomPresenter::OnClockRestart(MFTIME) HRESULT EVRCustomPresenter::OnClockStop(MFTIME) { - QMutexLocker locker(&m_mutex); + const std::lock_guard<QRecursiveMutex> locker(m_mutex); HRESULT hr = checkShutdown(); if (FAILED(hr)) @@ -899,7 +901,7 @@ HRESULT EVRCustomPresenter::OnClockStop(MFTIME) HRESULT EVRCustomPresenter::OnClockPause(MFTIME) { - QMutexLocker locker(&m_mutex); + const std::lock_guard<QRecursiveMutex> locker(m_mutex); // We cannot pause the clock after shutdown. HRESULT hr = checkShutdown(); @@ -916,7 +918,7 @@ HRESULT EVRCustomPresenter::OnClockSetRate(MFTIME, float rate) // The presenter reports its maximum rate through the IMFRateSupport interface. // Here, we assume that the EVR honors the maximum rate. - QMutexLocker locker(&m_mutex); + const std::lock_guard<QRecursiveMutex> locker(m_mutex); HRESULT hr = checkShutdown(); if (FAILED(hr)) @@ -944,7 +946,7 @@ HRESULT EVRCustomPresenter::GetSlowestRate(MFRATE_DIRECTION, BOOL, float *rate) if (!rate) return E_POINTER; - QMutexLocker locker(&m_mutex); + const std::lock_guard<QRecursiveMutex> locker(m_mutex); HRESULT hr = checkShutdown(); @@ -961,7 +963,7 @@ HRESULT EVRCustomPresenter::GetFastestRate(MFRATE_DIRECTION direction, BOOL thin if (!rate) return E_POINTER; - QMutexLocker locker(&m_mutex); + const std::lock_guard<QRecursiveMutex> locker(m_mutex); float maxRate = 0.0f; @@ -983,7 +985,7 @@ HRESULT EVRCustomPresenter::GetFastestRate(MFRATE_DIRECTION direction, BOOL thin HRESULT EVRCustomPresenter::IsRateSupported(BOOL thin, float rate, float *nearestSupportedRate) { - QMutexLocker locker(&m_mutex); + const std::lock_guard<QRecursiveMutex> locker(m_mutex); float maxRate = 0.0f; float nearestRate = rate; // If we support rate, that is the nearest. @@ -1017,7 +1019,7 @@ HRESULT EVRCustomPresenter::IsRateSupported(BOOL thin, float rate, float *neares void EVRCustomPresenter::supportedFormatsChanged() { - QMutexLocker locker(&m_mutex); + const std::lock_guard<QRecursiveMutex> locker(m_mutex); m_canRenderToSurface = false; m_presentEngine->setHint(D3DPresentEngine::RenderToTexture, false); @@ -1030,7 +1032,7 @@ void EVRCustomPresenter::supportedFormatsChanged() m_canRenderToSurface = true; } else { formats = m_surface->supportedPixelFormats(QAbstractVideoBuffer::NoHandle); - Q_FOREACH (QVideoFrame::PixelFormat format, formats) { + for (QVideoFrame::PixelFormat format : qAsConst(formats)) { if (SUCCEEDED(m_presentEngine->checkFormat(qt_evr_D3DFormatFromPixelFormat(format)))) { m_canRenderToSurface = true; break; diff --git a/src/plugins/common/evr/evrcustompresenter.h b/src/plugins/common/evr/evrcustompresenter.h index 9e1ee88d6..c1c21580e 100644 --- a/src/plugins/common/evr/evrcustompresenter.h +++ b/src/plugins/common/evr/evrcustompresenter.h @@ -342,7 +342,7 @@ private: RenderState m_renderState; FrameStep m_frameStep; - QMutex m_mutex; + QRecursiveMutex m_mutex; // Samples and scheduling Scheduler m_scheduler; // Manages scheduling of samples. diff --git a/src/plugins/directshow/camera/dscameracontrol.cpp b/src/plugins/directshow/camera/dscameracontrol.cpp index 67971d1b5..3f60ec848 100644 --- a/src/plugins/directshow/camera/dscameracontrol.cpp +++ b/src/plugins/directshow/camera/dscameracontrol.cpp @@ -47,8 +47,6 @@ QT_BEGIN_NAMESPACE DSCameraControl::DSCameraControl(QObject *parent) : QCameraControl(parent) - , m_state(QCamera::UnloadedState) - , m_captureMode(QCamera::CaptureStillImage) { m_session = qobject_cast<DSCameraSession*>(parent); connect(m_session, &DSCameraSession::statusChanged, this, diff --git a/src/plugins/directshow/camera/dscameracontrol.h b/src/plugins/directshow/camera/dscameracontrol.h index b9fb2766d..2087623d1 100644 --- a/src/plugins/directshow/camera/dscameracontrol.h +++ b/src/plugins/directshow/camera/dscameracontrol.h @@ -52,7 +52,7 @@ class DSCameraControl : public QCameraControl { Q_OBJECT public: - DSCameraControl(QObject *parent = 0); + DSCameraControl(QObject *parent = nullptr); ~DSCameraControl() override; QCamera::State state() const override { return m_state; } @@ -69,8 +69,8 @@ public: private: DSCameraSession *m_session; - QCamera::State m_state; - QCamera::CaptureModes m_captureMode; + QCamera::State m_state = QCamera::UnloadedState; + QCamera::CaptureModes m_captureMode = QCamera::CaptureStillImage; }; QT_END_NAMESPACE diff --git a/src/plugins/directshow/camera/dscameraservice.cpp b/src/plugins/directshow/camera/dscameraservice.cpp index 8115ef385..ff488cf09 100644 --- a/src/plugins/directshow/camera/dscameraservice.cpp +++ b/src/plugins/directshow/camera/dscameraservice.cpp @@ -62,14 +62,12 @@ DSCameraService::DSCameraService(QObject *parent): , m_session(new DSCameraSession(this)) , m_control(new DSCameraControl(m_session)) , m_videoDevice(new DSVideoDeviceControl(m_session)) - , m_videoRenderer(0) , m_imageCapture(new DSImageCaptureControl(m_session)) , m_viewfinderSettings(new DSCameraViewfinderSettingsControl(m_session)) , m_imageProcessingControl(new DSCameraImageProcessingControl(m_session)) , m_exposureControl(new DirectShowCameraExposureControl(m_session)) , m_captureDestinationControl(new DirectShowCameraCaptureDestinationControl(m_session)) , m_captureBufferFormatControl(new DirectShowCameraCaptureBufferFormatControl) - , m_videoProbeControl(nullptr) , m_zoomControl(new DirectShowCameraZoomControl(m_session)) , m_imageEncoderControl(new DirectShowCameraImageEncoderControl(m_session)) { @@ -140,14 +138,14 @@ QMediaControl* DSCameraService::requestControl(const char *name) if (qstrcmp(name, QImageEncoderControl_iid) == 0) return m_imageEncoderControl; - return 0; + return nullptr; } void DSCameraService::releaseControl(QMediaControl *control) { if (control == m_videoRenderer) { delete m_videoRenderer; - m_videoRenderer = 0; + m_videoRenderer = nullptr; return; } diff --git a/src/plugins/directshow/camera/dscameraservice.h b/src/plugins/directshow/camera/dscameraservice.h index 9a8f745f6..6ea85b725 100644 --- a/src/plugins/directshow/camera/dscameraservice.h +++ b/src/plugins/directshow/camera/dscameraservice.h @@ -64,7 +64,7 @@ class DSCameraService : public QMediaService Q_OBJECT public: - DSCameraService(QObject *parent = 0); + DSCameraService(QObject *parent = nullptr); ~DSCameraService() override; QMediaControl* requestControl(const char *name) override; @@ -74,14 +74,14 @@ private: DSCameraSession *m_session; DSCameraControl *m_control; DSVideoDeviceControl *m_videoDevice; - QMediaControl *m_videoRenderer; + QMediaControl *m_videoRenderer = nullptr; DSImageCaptureControl *m_imageCapture; DSCameraViewfinderSettingsControl *m_viewfinderSettings; DSCameraImageProcessingControl *m_imageProcessingControl; DirectShowCameraExposureControl *m_exposureControl; DirectShowCameraCaptureDestinationControl *m_captureDestinationControl; DirectShowCameraCaptureBufferFormatControl *m_captureBufferFormatControl; - DirectShowVideoProbeControl *m_videoProbeControl; + DirectShowVideoProbeControl *m_videoProbeControl = nullptr; DirectShowCameraZoomControl *m_zoomControl; DirectShowCameraImageEncoderControl *m_imageEncoderControl; }; diff --git a/src/plugins/directshow/camera/dscamerasession.cpp b/src/plugins/directshow/camera/dscamerasession.cpp index 267e7a9a4..a0c120816 100644 --- a/src/plugins/directshow/camera/dscamerasession.cpp +++ b/src/plugins/directshow/camera/dscamerasession.cpp @@ -58,23 +58,6 @@ QT_BEGIN_NAMESPACE DSCameraSession::DSCameraSession(QObject *parent) : QObject(parent) - , m_graphBuilder(nullptr) - , m_filterGraph(nullptr) - , m_sourceDeviceName(QLatin1String("default")) - , m_sourceFilter(nullptr) - , m_needsHorizontalMirroring(false) - , m_previewSampleGrabber(nullptr) - , m_nullRendererFilter(nullptr) - , m_previewStarted(false) - , m_surface(nullptr) - , m_previewPixelFormat(QVideoFrame::Format_Invalid) - , m_stride(-1) - , m_readyForCapture(false) - , m_imageIdCounter(0) - , m_currentImageId(-1) - , m_captureDestinations(QCameraImageCapture::CaptureToFile) - , m_videoProbeControl(nullptr) - , m_status(QCamera::UnloadedStatus) { connect(this, &DSCameraSession::statusChanged, this, &DSCameraSession::updateReadyForCapture); @@ -284,7 +267,7 @@ void DSCameraSession::setImageProcessingParameter( ImageProcessingParameterInfo>::iterator sourceValueInfo = m_imageProcessingParametersInfos.find(resultingParameter); - if (sourceValueInfo == m_imageProcessingParametersInfos.constEnd()) + if (sourceValueInfo == m_imageProcessingParametersInfos.end()) return; LONG sourceValue = 0; @@ -464,7 +447,7 @@ bool DSCameraSession::startPreview() QString errorString; HRESULT hr = S_OK; - IMediaControl* pControl = 0; + IMediaControl* pControl = nullptr; if (!configurePreviewFormat()) { errorString = tr("Failed to configure preview format"); @@ -516,7 +499,7 @@ bool DSCameraSession::stopPreview() m_previewSampleGrabber->stop(); QString errorString; - IMediaControl* pControl = 0; + IMediaControl* pControl = nullptr; HRESULT hr = m_filterGraph->QueryInterface(IID_IMediaControl, reinterpret_cast<void**>(&pControl)); if (FAILED(hr)) { @@ -740,12 +723,12 @@ bool DSCameraSession::createFilterGraph() pDevEnum->Release(); if (S_OK == hr) { pEnum->Reset(); - IMalloc *mallocInterface = 0; + IMalloc *mallocInterface = nullptr; CoGetMalloc(1, (LPMALLOC*)&mallocInterface); //go through and find all video capture devices while (pEnum->Next(1, &pMoniker, nullptr) == S_OK) { - BSTR strName = 0; + BSTR strName = nullptr; hr = pMoniker->GetDisplayName(nullptr, nullptr, &strName); if (SUCCEEDED(hr)) { QString output = QString::fromWCharArray(strName); @@ -769,7 +752,7 @@ bool DSCameraSession::createFilterGraph() pEnum->Reset(); // still have to loop to discard bind to storage failure case while (pEnum->Next(1, &pMoniker, nullptr) == S_OK) { - IPropertyBag *pPropBag = 0; + IPropertyBag *pPropBag = nullptr; hr = pMoniker->BindToStorage(nullptr, nullptr, IID_IPropertyBag, reinterpret_cast<void**>(&pPropBag)); @@ -780,17 +763,13 @@ bool DSCameraSession::createFilterGraph() // No need to get the description, just grab it - hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, + hr = pMoniker->BindToObject(nullptr, nullptr, IID_IBaseFilter, reinterpret_cast<void**>(&m_sourceFilter)); pPropBag->Release(); pMoniker->Release(); - if (SUCCEEDED(hr)) { + if (SUCCEEDED(hr)) break; // done, stop looping through - } - else - { - qWarning() << "Object bind failed"; - } + qWarning("Object bind failed"); } } } @@ -898,7 +877,7 @@ bool DSCameraSession::configurePreviewFormat() m_stride = DirectShowMediaType::bytesPerLine(m_previewSurfaceFormat); HRESULT hr; - IAMStreamConfig* pConfig = 0; + IAMStreamConfig* pConfig = nullptr; hr = m_graphBuilder->FindInterface(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, m_sourceFilter, IID_IAMStreamConfig, reinterpret_cast<void**>(&pConfig)); @@ -1064,21 +1043,21 @@ void DSCameraSession::updateSourceCapabilities() AM_MEDIA_TYPE *pmt = nullptr; VIDEOINFOHEADER *pvi = nullptr; VIDEO_STREAM_CONFIG_CAPS scc; - IAMStreamConfig* pConfig = 0; + IAMStreamConfig* pConfig = nullptr; m_supportedViewfinderSettings.clear(); m_needsHorizontalMirroring = false; m_supportedFormats.clear(); m_imageProcessingParametersInfos.clear(); - IAMVideoControl *pVideoControl = 0; + IAMVideoControl *pVideoControl = nullptr; hr = m_graphBuilder->FindInterface(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, m_sourceFilter, IID_IAMVideoControl, reinterpret_cast<void**>(&pVideoControl)); if (FAILED(hr)) { qWarning() << "Failed to get the video control"; } else { - IPin *pPin = 0; + IPin *pPin = nullptr; if (!DirectShowUtils::getPin(m_sourceFilter, PINDIR_OUTPUT, &pPin, &hr)) { qWarning() << "Failed to get the pin for the video control"; } else { @@ -1130,12 +1109,12 @@ void DSCameraSession::updateSourceCapabilities() QList<QCamera::FrameRateRange> frameRateRanges; if (pVideoControl) { - IPin *pPin = 0; + IPin *pPin = nullptr; if (!DirectShowUtils::getPin(m_sourceFilter, PINDIR_OUTPUT, &pPin, &hr)) { qWarning() << "Failed to get the pin for the video control"; } else { long listSize = 0; - LONGLONG *frameRates = 0; + LONGLONG *frameRates = nullptr; SIZE size = { resolution.width(), resolution.height() }; hr = pVideoControl->GetFrameRateList(pPin, iIndex, size, &listSize, &frameRates); if (hr == S_OK && listSize > 0 && frameRates) { diff --git a/src/plugins/directshow/camera/dscamerasession.h b/src/plugins/directshow/camera/dscamerasession.h index 18fc0cca7..5e7d026c2 100644 --- a/src/plugins/directshow/camera/dscamerasession.h +++ b/src/plugins/directshow/camera/dscamerasession.h @@ -84,7 +84,7 @@ class DSCameraSession : public QObject { Q_OBJECT public: - DSCameraSession(QObject *parent = 0); + DSCameraSession(QObject *parent = nullptr); ~DSCameraSession() override; QCamera::Status status() const { return m_status; } @@ -185,49 +185,48 @@ private: QMutex m_presentMutex; QMutex m_captureMutex; - // Capture Graph - ICaptureGraphBuilder2* m_graphBuilder; - IGraphBuilder* m_filterGraph; + ICaptureGraphBuilder2* m_graphBuilder = nullptr; + IGraphBuilder* m_filterGraph = nullptr; // Source (camera) - QString m_sourceDeviceName; - IBaseFilter* m_sourceFilter; - bool m_needsHorizontalMirroring; + QString m_sourceDeviceName = QLatin1String("default"); + IBaseFilter* m_sourceFilter = nullptr; + bool m_needsHorizontalMirroring = false; QList<DirectShowMediaType> m_supportedFormats; QList<QCameraViewfinderSettings> m_supportedViewfinderSettings; DirectShowMediaType m_sourceFormat; QMap<QCameraImageProcessingControl::ProcessingParameter, ImageProcessingParameterInfo> m_imageProcessingParametersInfos; // Preview - DirectShowSampleGrabber *m_previewSampleGrabber; - IBaseFilter *m_nullRendererFilter; + DirectShowSampleGrabber *m_previewSampleGrabber = nullptr; + IBaseFilter *m_nullRendererFilter = nullptr; QVideoFrame m_currentFrame; - bool m_previewStarted; - QAbstractVideoSurface* m_surface; + bool m_previewStarted = false; + QAbstractVideoSurface* m_surface = nullptr; QVideoSurfaceFormat m_previewSurfaceFormat; - QVideoFrame::PixelFormat m_previewPixelFormat; + QVideoFrame::PixelFormat m_previewPixelFormat = QVideoFrame::Format_RGB32; QSize m_previewSize; - int m_stride; + int m_stride = -1; QCameraViewfinderSettings m_viewfinderSettings; QCameraViewfinderSettings m_actualViewfinderSettings; // Image capture QString m_imageCaptureFileName; QMediaStorageLocation m_fileNameGenerator; - bool m_readyForCapture; - int m_imageIdCounter; - int m_currentImageId; + bool m_readyForCapture = false; + int m_imageIdCounter = 0; + int m_currentImageId = -1; QVideoFrame m_capturedFrame; - QCameraImageCapture::CaptureDestinations m_captureDestinations; + QCameraImageCapture::CaptureDestinations m_captureDestinations = QCameraImageCapture::CaptureToFile; // Video probe QMutex m_probeMutex; - DirectShowVideoProbeControl *m_videoProbeControl; + DirectShowVideoProbeControl *m_videoProbeControl = nullptr; QImageEncoderSettings m_imageEncoderSettings; // Internal state - QCamera::Status m_status; + QCamera::Status m_status = QCamera::UnloadedStatus; QTimer m_deviceLostEventTimer; QMap<QCameraImageProcessingControl::ProcessingParameter, QVariant> m_pendingImageProcessingParametrs; diff --git a/src/plugins/directshow/camera/dsvideodevicecontrol.cpp b/src/plugins/directshow/camera/dsvideodevicecontrol.cpp index 7285d0fb3..0f08154f1 100644 --- a/src/plugins/directshow/camera/dsvideodevicecontrol.cpp +++ b/src/plugins/directshow/camera/dsvideodevicecontrol.cpp @@ -143,10 +143,10 @@ void DSVideoDeviceControl::updateDevices() pEnum->Reset(); // go through and find all video capture devices IMoniker* pMoniker = nullptr; - IMalloc *mallocInterface = 0; + IMalloc *mallocInterface = nullptr; CoGetMalloc(1, (LPMALLOC*)&mallocInterface); while (pEnum->Next(1, &pMoniker, nullptr) == S_OK) { - BSTR strName = 0; + BSTR strName = nullptr; hr = pMoniker->GetDisplayName(nullptr, nullptr, &strName); if (SUCCEEDED(hr)) { QString output(QString::fromWCharArray(strName)); @@ -162,7 +162,7 @@ void DSVideoDeviceControl::updateDevices() // Find the description VARIANT varName; varName.vt = VT_BSTR; - hr = pPropBag->Read(L"FriendlyName", &varName, 0); + hr = pPropBag->Read(L"FriendlyName", &varName, nullptr); if (SUCCEEDED(hr)) { output = QString::fromWCharArray(varName.bstrVal); } diff --git a/src/plugins/directshow/camera/dsvideodevicecontrol.h b/src/plugins/directshow/camera/dsvideodevicecontrol.h index 7a7a0af1e..24a5b61a1 100644 --- a/src/plugins/directshow/camera/dsvideodevicecontrol.h +++ b/src/plugins/directshow/camera/dsvideodevicecontrol.h @@ -48,13 +48,13 @@ class DSCameraSession; //QTM_USE_NAMESPACE -typedef QPair<QByteArray, QString> DSVideoDeviceInfo; +using DSVideoDeviceInfo = QPair<QByteArray, QString>; class DSVideoDeviceControl : public QVideoDeviceSelectorControl { Q_OBJECT public: - DSVideoDeviceControl(QObject *parent = 0); + DSVideoDeviceControl(QObject *parent = nullptr); int deviceCount() const override; QString deviceName(int index) const override; diff --git a/src/plugins/directshow/camera/dsvideorenderer.cpp b/src/plugins/directshow/camera/dsvideorenderer.cpp index bf0aa2684..cde63af65 100644 --- a/src/plugins/directshow/camera/dsvideorenderer.cpp +++ b/src/plugins/directshow/camera/dsvideorenderer.cpp @@ -45,7 +45,6 @@ QT_BEGIN_NAMESPACE DSVideoRendererControl::DSVideoRendererControl(DSCameraSession* session, QObject *parent) :QVideoRendererControl(parent), - m_surface(0), m_session(session) { } diff --git a/src/plugins/directshow/camera/dsvideorenderer.h b/src/plugins/directshow/camera/dsvideorenderer.h index 3a4570b4c..a6a1f8103 100644 --- a/src/plugins/directshow/camera/dsvideorenderer.h +++ b/src/plugins/directshow/camera/dsvideorenderer.h @@ -50,7 +50,7 @@ class DSVideoRendererControl : public QVideoRendererControl { Q_OBJECT public: - DSVideoRendererControl(DSCameraSession* session, QObject *parent = 0); + DSVideoRendererControl(DSCameraSession* session, QObject *parent = nullptr); ~DSVideoRendererControl() override; QAbstractVideoSurface *surface() const override; @@ -59,7 +59,7 @@ public: void setSession(DSCameraSession* session); private: - QAbstractVideoSurface* m_surface; + QAbstractVideoSurface* m_surface = nullptr; DSCameraSession* m_session; }; diff --git a/src/plugins/directshow/common/directshowbasefilter.cpp b/src/plugins/directshow/common/directshowbasefilter.cpp index d64021ed6..3a13dce0e 100644 --- a/src/plugins/directshow/common/directshowbasefilter.cpp +++ b/src/plugins/directshow/common/directshowbasefilter.cpp @@ -41,17 +41,12 @@ #include "directshowpinenum.h" +#include <mutex> + QT_BEGIN_NAMESPACE DirectShowBaseFilter::DirectShowBaseFilter() - : m_mutex(QMutex::Recursive) - , m_state(State_Stopped) - , m_graph(nullptr) - , m_clock(nullptr) - , m_sink(nullptr) -{ - -} + = default; DirectShowBaseFilter::~DirectShowBaseFilter() { @@ -75,15 +70,14 @@ HRESULT DirectShowBaseFilter::NotifyEvent(long eventCode, LONG_PTR eventParam1, eventParam2 = (LONG_PTR)(IBaseFilter*)this; return sink->Notify(eventCode, eventParam1, eventParam2); - } else { - return E_NOTIMPL; } + return E_NOTIMPL; } HRESULT DirectShowBaseFilter::Run(REFERENCE_TIME tStart) { Q_UNUSED(tStart) - QMutexLocker locker(&m_mutex); + const std::lock_guard<QRecursiveMutex> locker(m_mutex); m_startTime = tStart; @@ -100,7 +94,7 @@ HRESULT DirectShowBaseFilter::Run(REFERENCE_TIME tStart) HRESULT DirectShowBaseFilter::Pause() { - QMutexLocker locker(&m_mutex); + const std::lock_guard<QRecursiveMutex> locker(m_mutex); if (m_state == State_Stopped) { const QList<DirectShowPin *> pinList = pins(); @@ -120,7 +114,7 @@ HRESULT DirectShowBaseFilter::Pause() HRESULT DirectShowBaseFilter::Stop() { - QMutexLocker locker(&m_mutex); + const std::lock_guard<QRecursiveMutex> locker(m_mutex); HRESULT hr = S_OK; @@ -147,7 +141,7 @@ HRESULT DirectShowBaseFilter::GetState(DWORD dwMilliSecsTimeout, FILTER_STATE *p if (!pState) { return E_POINTER; } else { - QMutexLocker locker(&m_mutex); + const std::lock_guard<QRecursiveMutex> locker(m_mutex); *pState = m_state; @@ -157,7 +151,7 @@ HRESULT DirectShowBaseFilter::GetState(DWORD dwMilliSecsTimeout, FILTER_STATE *p HRESULT DirectShowBaseFilter::SetSyncSource(IReferenceClock *pClock) { - QMutexLocker locker(&m_mutex); + const std::lock_guard<QRecursiveMutex> locker(m_mutex); if (m_clock) m_clock->Release(); @@ -197,7 +191,7 @@ HRESULT DirectShowBaseFilter::FindPin(LPCWSTR Id, IPin **ppPin) if (!ppPin || !Id) return E_POINTER; - QMutexLocker locker(&m_mutex); + const std::lock_guard<QRecursiveMutex> locker(m_mutex); const QList<DirectShowPin *> pinList = pins(); for (DirectShowPin *pin : pinList) { if (pin->name() == QStringView(Id)) { @@ -207,13 +201,13 @@ HRESULT DirectShowBaseFilter::FindPin(LPCWSTR Id, IPin **ppPin) } } - *ppPin = 0; + *ppPin = nullptr; return VFW_E_NOT_FOUND; } HRESULT DirectShowBaseFilter::JoinFilterGraph(IFilterGraph *pGraph, LPCWSTR pName) { - QMutexLocker locker(&m_mutex); + const std::lock_guard<QRecursiveMutex> locker(m_mutex); m_filterName = QString::fromWCharArray(pName); m_graph = pGraph; diff --git a/src/plugins/directshow/common/directshowbasefilter.h b/src/plugins/directshow/common/directshowbasefilter.h index fe78f96b2..ce30891d7 100644 --- a/src/plugins/directshow/common/directshowbasefilter.h +++ b/src/plugins/directshow/common/directshowbasefilter.h @@ -78,13 +78,13 @@ public: STDMETHODIMP QueryVendorInfo(LPWSTR *pVendorInfo) override; protected: - QMutex m_mutex; - FILTER_STATE m_state; - IFilterGraph *m_graph; - IReferenceClock *m_clock; - IMediaEventSink *m_sink; + QRecursiveMutex m_mutex; + FILTER_STATE m_state = State_Stopped; + IFilterGraph *m_graph = nullptr; + IReferenceClock *m_clock = nullptr; + IMediaEventSink *m_sink = nullptr; QString m_filterName; - REFERENCE_TIME m_startTime; + REFERENCE_TIME m_startTime = 0; private: Q_DISABLE_COPY(DirectShowBaseFilter) diff --git a/src/plugins/directshow/common/directshoweventloop.cpp b/src/plugins/directshow/common/directshoweventloop.cpp index 843a78422..692c873cf 100644 --- a/src/plugins/directshow/common/directshoweventloop.cpp +++ b/src/plugins/directshow/common/directshoweventloop.cpp @@ -51,7 +51,6 @@ public: DirectShowPostedEvent(QObject *receiver, QEvent *event) : receiver(receiver) , event(event) - , next(0) { } @@ -62,13 +61,11 @@ public: QObject *receiver; QEvent *event; - DirectShowPostedEvent *next; + DirectShowPostedEvent *next = nullptr; }; DirectShowEventLoop::DirectShowEventLoop(QObject *parent) : QObject(parent) - , m_postsHead(0) - , m_postsTail(0) , m_eventHandle(::CreateEvent(nullptr, FALSE, FALSE, nullptr)) , m_waitHandle(::CreateEvent(nullptr, FALSE, FALSE, nullptr)) { @@ -141,7 +138,7 @@ void DirectShowEventLoop::processEvents() m_postsHead = m_postsHead->next; if (!m_postsHead) - m_postsTail = 0; + m_postsTail = nullptr; locker.unlock(); QCoreApplication::sendEvent(post->receiver, post->event); diff --git a/src/plugins/directshow/common/directshoweventloop.h b/src/plugins/directshow/common/directshoweventloop.h index a29274b7b..984bd23a4 100644 --- a/src/plugins/directshow/common/directshoweventloop.h +++ b/src/plugins/directshow/common/directshoweventloop.h @@ -54,7 +54,7 @@ class DirectShowEventLoop : public QObject { Q_OBJECT public: - DirectShowEventLoop(QObject *parent = 0); + DirectShowEventLoop(QObject *parent = nullptr); ~DirectShowEventLoop() override; void wait(QMutex *mutex); @@ -68,8 +68,8 @@ protected: private: void processEvents(); - DirectShowPostedEvent *m_postsHead; - DirectShowPostedEvent *m_postsTail; + DirectShowPostedEvent *m_postsHead = nullptr; + DirectShowPostedEvent *m_postsTail = nullptr; HANDLE m_eventHandle; HANDLE m_waitHandle; QMutex m_mutex; diff --git a/src/plugins/directshow/common/directshowglobal.h b/src/plugins/directshow/common/directshowglobal.h index d98dd36ee..12693e4f1 100644 --- a/src/plugins/directshow/common/directshowglobal.h +++ b/src/plugins/directshow/common/directshowglobal.h @@ -53,27 +53,27 @@ QT_END_NAMESPACE template <typename T> T *com_cast(IUnknown *unknown, const IID &iid) { - T *iface = 0; + T *iface = nullptr; return unknown && unknown->QueryInterface(iid, reinterpret_cast<void **>(&iface)) == S_OK ? iface - : 0; + : nullptr; } template <typename T> T *com_new(const IID &clsid) { - T *object = 0; + T *object = nullptr; return CoCreateInstance( clsid, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&object)) == S_OK ? object - : 0; + : nullptr; } template <typename T> T *com_new(const IID &clsid, const IID &iid) { - T *object = 0; + T *object = nullptr; return CoCreateInstance( clsid, nullptr, @@ -81,7 +81,7 @@ template <typename T> T *com_new(const IID &clsid, const IID &iid) iid, reinterpret_cast<void **>(&object)) == S_OK ? object - : 0; + : nullptr; } DEFINE_GUID(MEDIASUBTYPE_I420, diff --git a/src/plugins/directshow/common/directshowmediatypeenum.cpp b/src/plugins/directshow/common/directshowmediatypeenum.cpp index 56716ed75..0ff147fea 100644 --- a/src/plugins/directshow/common/directshowmediatypeenum.cpp +++ b/src/plugins/directshow/common/directshowmediatypeenum.cpp @@ -42,17 +42,13 @@ #include "directshowpin.h" DirectShowMediaTypeEnum::DirectShowMediaTypeEnum(DirectShowPin *pin) - : m_pin(pin) - , m_mediaTypes(pin->supportedMediaTypes()) - , m_index(0) + : m_mediaTypes(pin->supportedMediaTypes()) { m_pin->AddRef(); } DirectShowMediaTypeEnum::DirectShowMediaTypeEnum(const QList<DirectShowMediaType> &types) - : m_pin(nullptr) - , m_mediaTypes(types) - , m_index(0) + : m_mediaTypes(types) { } diff --git a/src/plugins/directshow/common/directshowmediatypeenum.h b/src/plugins/directshow/common/directshowmediatypeenum.h index e78e0a0f2..a5c347004 100644 --- a/src/plugins/directshow/common/directshowmediatypeenum.h +++ b/src/plugins/directshow/common/directshowmediatypeenum.h @@ -67,9 +67,9 @@ public: private: Q_DISABLE_COPY(DirectShowMediaTypeEnum) - DirectShowPin *m_pin; + DirectShowPin *m_pin = nullptr; QList<DirectShowMediaType> m_mediaTypes; - int m_index; + int m_index = 0; }; QT_END_NAMESPACE diff --git a/src/plugins/directshow/common/directshowpin.cpp b/src/plugins/directshow/common/directshowpin.cpp index 617cc2cf2..d8129748c 100644 --- a/src/plugins/directshow/common/directshowpin.cpp +++ b/src/plugins/directshow/common/directshowpin.cpp @@ -45,14 +45,14 @@ #include <qdebug.h> +#include <mutex> + QT_BEGIN_NAMESPACE DirectShowPin::DirectShowPin(DirectShowBaseFilter *filter, const QString &name, PIN_DIRECTION direction) - : m_mutex(QMutex::Recursive) - , m_filter(filter) + : m_filter(filter) , m_name(name) , m_direction(direction) - , m_peerPin(nullptr) { } @@ -64,7 +64,7 @@ HRESULT DirectShowPin::Connect(IPin *pReceivePin, const AM_MEDIA_TYPE *pmt) return E_POINTER; HRESULT hr = E_FAIL; - QMutexLocker locker(&m_mutex); + const std::lock_guard<QRecursiveMutex> locker(m_mutex); if (m_peerPin) return VFW_E_ALREADY_CONNECTED; @@ -170,7 +170,7 @@ HRESULT DirectShowPin::ReceiveConnection(IPin *pConnector, const AM_MEDIA_TYPE * if (!pConnector || !pmt) return E_POINTER; - QMutexLocker locker(&m_mutex); + const std::lock_guard<QRecursiveMutex> locker(m_mutex); if (m_peerPin) return VFW_E_ALREADY_CONNECTED; @@ -207,7 +207,7 @@ HRESULT DirectShowPin::ReceiveConnection(IPin *pConnector, const AM_MEDIA_TYPE * HRESULT DirectShowPin::Disconnect() { - QMutexLocker locker(&m_mutex); + const std::lock_guard<QRecursiveMutex> locker(m_mutex); if (m_filter->state() != State_Stopped) return VFW_E_NOT_STOPPED; @@ -233,9 +233,9 @@ HRESULT DirectShowPin::ConnectedTo(IPin **ppPin) if (!ppPin) return E_POINTER; - QMutexLocker locker(&m_mutex); + const std::lock_guard<QRecursiveMutex> locker(m_mutex); if (!m_peerPin) { - *ppPin = 0; + *ppPin = nullptr; return VFW_E_NOT_CONNECTED; } m_peerPin->AddRef(); @@ -248,7 +248,7 @@ HRESULT DirectShowPin::ConnectionMediaType(AM_MEDIA_TYPE *pmt) if (!pmt) return E_POINTER; - QMutexLocker locker(&m_mutex); + const std::lock_guard<QRecursiveMutex> locker(m_mutex); if (!m_peerPin) { DirectShowMediaType::init(pmt); return VFW_E_NOT_CONNECTED; @@ -380,8 +380,6 @@ HRESULT DirectShowPin::setActive(bool active) DirectShowOutputPin::DirectShowOutputPin(DirectShowBaseFilter *filter, const QString &name) : DirectShowPin(filter, name, PINDIR_OUTPUT) - , m_allocator(nullptr) - , m_inputPin(nullptr) { } @@ -485,9 +483,6 @@ HRESULT DirectShowOutputPin::EndOfStream() DirectShowInputPin::DirectShowInputPin(DirectShowBaseFilter *filter, const QString &name) : DirectShowPin(filter, name, PINDIR_INPUT) - , m_allocator(nullptr) - , m_flushing(false) - , m_inErrorState(false) { ZeroMemory(&m_sampleProperties, sizeof(m_sampleProperties)); } @@ -537,14 +532,14 @@ HRESULT DirectShowInputPin::EndOfStream() HRESULT DirectShowInputPin::BeginFlush() { - QMutexLocker locker(&m_mutex); + const std::lock_guard<QRecursiveMutex> locker(m_mutex); m_flushing = true; return S_OK; } HRESULT DirectShowInputPin::EndFlush() { - QMutexLocker locker(&m_mutex); + const std::lock_guard<QRecursiveMutex> locker(m_mutex); m_flushing = false; m_inErrorState = false; return S_OK; @@ -555,7 +550,7 @@ HRESULT DirectShowInputPin::GetAllocator(IMemAllocator **ppAllocator) if (!ppAllocator) return E_POINTER; - QMutexLocker locker(&m_mutex); + const std::lock_guard<QRecursiveMutex> locker(m_mutex); if (!m_allocator) { m_allocator = com_new<IMemAllocator>(CLSID_MemoryAllocator);; @@ -576,7 +571,7 @@ HRESULT DirectShowInputPin::NotifyAllocator(IMemAllocator *pAllocator, BOOL bRea if (!pAllocator) return E_POINTER; - QMutexLocker locker(&m_mutex); + const std::lock_guard<QRecursiveMutex> locker(m_mutex); if (m_allocator) m_allocator->Release(); diff --git a/src/plugins/directshow/common/directshowpin.h b/src/plugins/directshow/common/directshowpin.h index 6370fd367..160191ef3 100644 --- a/src/plugins/directshow/common/directshowpin.h +++ b/src/plugins/directshow/common/directshowpin.h @@ -96,13 +96,13 @@ public: protected: DirectShowPin(DirectShowBaseFilter *filter, const QString &name, PIN_DIRECTION direction); - QMutex m_mutex; + QRecursiveMutex m_mutex; DirectShowBaseFilter *m_filter; QString m_name; PIN_DIRECTION m_direction; - IPin *m_peerPin; + IPin *m_peerPin = nullptr; DirectShowMediaType m_mediaType; private: @@ -128,8 +128,8 @@ public: protected: DirectShowOutputPin(DirectShowBaseFilter *filter, const QString &name); - IMemAllocator *m_allocator; - IMemInputPin *m_inputPin; + IMemAllocator *m_allocator = nullptr; + IMemInputPin *m_inputPin = nullptr; private: Q_DISABLE_COPY(DirectShowOutputPin) @@ -166,9 +166,9 @@ public: protected: DirectShowInputPin(DirectShowBaseFilter *filter, const QString &name); - IMemAllocator *m_allocator; - bool m_flushing; - bool m_inErrorState; + IMemAllocator *m_allocator = nullptr; + bool m_flushing = false; + bool m_inErrorState = false; AM_SAMPLE2_PROPERTIES m_sampleProperties; private: diff --git a/src/plugins/directshow/common/directshowpinenum.cpp b/src/plugins/directshow/common/directshowpinenum.cpp index a340c0903..7ba1bb6e9 100644 --- a/src/plugins/directshow/common/directshowpinenum.cpp +++ b/src/plugins/directshow/common/directshowpinenum.cpp @@ -44,7 +44,6 @@ QT_BEGIN_NAMESPACE DirectShowPinEnum::DirectShowPinEnum(DirectShowBaseFilter *filter) : m_filter(filter) - , m_index(0) { m_filter->AddRef(); const QList<DirectShowPin *> pinList = filter->pins(); @@ -55,9 +54,7 @@ DirectShowPinEnum::DirectShowPinEnum(DirectShowBaseFilter *filter) } DirectShowPinEnum::DirectShowPinEnum(const QList<IPin *> &pins) - : m_filter(nullptr) - , m_pins(pins) - , m_index(0) + : m_pins(pins) { for (IPin *pin : qAsConst(m_pins)) pin->AddRef(); diff --git a/src/plugins/directshow/common/directshowpinenum.h b/src/plugins/directshow/common/directshowpinenum.h index d89f140b1..aada1a71e 100644 --- a/src/plugins/directshow/common/directshowpinenum.h +++ b/src/plugins/directshow/common/directshowpinenum.h @@ -68,9 +68,9 @@ public: private: Q_DISABLE_COPY(DirectShowPinEnum) - DirectShowBaseFilter *m_filter; + DirectShowBaseFilter *m_filter = nullptr; QList<IPin *> m_pins; - int m_index; + int m_index = 0; }; QT_END_NAMESPACE diff --git a/src/plugins/directshow/common/directshowsamplegrabber.cpp b/src/plugins/directshow/common/directshowsamplegrabber.cpp index 254066d4e..a9e74f9db 100644 --- a/src/plugins/directshow/common/directshowsamplegrabber.cpp +++ b/src/plugins/directshow/common/directshowsamplegrabber.cpp @@ -82,7 +82,8 @@ public: AddRef(); *ppvObject = static_cast<IUnknown *>(this); return S_OK; - } else if (riid == IID_ISampleGrabberCB /*__uuidof(ISampleGrabberCB)*/ ) { + } + if (riid == IID_ISampleGrabberCB /*__uuidof(ISampleGrabberCB)*/ ) { AddRef(); *ppvObject = static_cast<ISampleGrabberCB *>(this); return S_OK; @@ -115,9 +116,6 @@ private: DirectShowSampleGrabber::DirectShowSampleGrabber(QObject *p) : QObject(p) - , m_sampleGrabber(nullptr) - , m_sampleGabberCb(nullptr) - , m_callbackType(CallbackMethod::BufferCB) { // Create sample grabber filter HRESULT hr = CoCreateInstance(cLSID_SampleGrabber, nullptr, CLSCTX_INPROC, iID_ISampleGrabber, reinterpret_cast<void **>(&m_sampleGrabber)); diff --git a/src/plugins/directshow/common/directshowsamplegrabber.h b/src/plugins/directshow/common/directshowsamplegrabber.h index a9b72fcd1..5fc61de14 100644 --- a/src/plugins/directshow/common/directshowsamplegrabber.h +++ b/src/plugins/directshow/common/directshowsamplegrabber.h @@ -78,10 +78,10 @@ Q_SIGNALS: void bufferAvailable(double time, const QByteArray &data); private: - IBaseFilter *m_filter; - ISampleGrabber *m_sampleGrabber; - SampleGrabberCallbackPrivate *m_sampleGabberCb; - CallbackMethod m_callbackType; + IBaseFilter *m_filter = nullptr; + ISampleGrabber *m_sampleGrabber = nullptr; + SampleGrabberCallbackPrivate *m_sampleGabberCb = nullptr; + CallbackMethod m_callbackType= CallbackMethod::BufferCB; }; QT_END_NAMESPACE diff --git a/src/plugins/directshow/common/directshowutils.cpp b/src/plugins/directshow/common/directshowutils.cpp index 13b51deb5..1457837ce 100644 --- a/src/plugins/directshow/common/directshowutils.cpp +++ b/src/plugins/directshow/common/directshowutils.cpp @@ -300,7 +300,7 @@ bool DirectShowUtils::connectFilters(IGraphBuilder *graph, } IBaseFilter *nextFilter = nullptr; - while (S_OK == filters->Next(1, &nextFilter, 0)) { + while (S_OK == filters->Next(1, &nextFilter, nullptr)) { const ScopedSafeRelease<IBaseFilter> releaseNextFilter { &nextFilter }; if (nextFilter && findAndConnect(nextFilter)) return true; diff --git a/src/plugins/directshow/common/directshowvideobuffer.cpp b/src/plugins/directshow/common/directshowvideobuffer.cpp index 7f94da97e..fc329f58a 100644 --- a/src/plugins/directshow/common/directshowvideobuffer.cpp +++ b/src/plugins/directshow/common/directshowvideobuffer.cpp @@ -64,7 +64,7 @@ uchar *DirectShowVideoBuffer::map(MapMode mode, int *numBytes, int *bytesPerLine if (bytesPerLine) *bytesPerLine = m_bytesPerLine; - BYTE *bytes = 0; + BYTE *bytes = nullptr; if (m_sample->GetPointer(&bytes) == S_OK) { m_mapMode = mode; @@ -72,7 +72,7 @@ uchar *DirectShowVideoBuffer::map(MapMode mode, int *numBytes, int *bytesPerLine return reinterpret_cast<uchar *>(bytes); } } - return 0; + return nullptr; } void DirectShowVideoBuffer::unmap() diff --git a/src/plugins/directshow/dsserviceplugin.cpp b/src/plugins/directshow/dsserviceplugin.cpp index cc25e35b7..18a807fd1 100644 --- a/src/plugins/directshow/dsserviceplugin.cpp +++ b/src/plugins/directshow/dsserviceplugin.cpp @@ -87,7 +87,7 @@ QMediaService* DSServicePlugin::create(QString const& key) return new DirectShowPlayerService; } - return 0; + return nullptr; } void DSServicePlugin::release(QMediaService *service) diff --git a/src/plugins/directshow/player/directshowaudioendpointcontrol.cpp b/src/plugins/directshow/player/directshowaudioendpointcontrol.cpp index 78733972a..f4e45cdd8 100644 --- a/src/plugins/directshow/player/directshowaudioendpointcontrol.cpp +++ b/src/plugins/directshow/player/directshowaudioendpointcontrol.cpp @@ -48,8 +48,6 @@ DirectShowAudioEndpointControl::DirectShowAudioEndpointControl( DirectShowPlayerService *service, QObject *parent) : QAudioOutputSelectorControl(parent) , m_service(service) - , m_bindContext(0) - , m_deviceEnumerator(0) { if (CreateBindCtx(0, &m_bindContext) == S_OK) { m_deviceEnumerator = com_new<ICreateDevEnum>(CLSID_SystemDeviceEnum); @@ -83,12 +81,12 @@ QString DirectShowAudioEndpointControl::outputDescription(const QString &name) c QString description; if (IMoniker *moniker = m_devices.value(name, 0)) { - IPropertyBag *propertyBag = 0; + IPropertyBag *propertyBag = nullptr; if (SUCCEEDED(moniker->BindToStorage( - 0, 0, IID_IPropertyBag, reinterpret_cast<void **>(&propertyBag)))) { + nullptr, nullptr, IID_IPropertyBag, reinterpret_cast<void **>(&propertyBag)))) { VARIANT name; VariantInit(&name); - if (SUCCEEDED(propertyBag->Read(L"FriendlyName", &name, 0))) + if (SUCCEEDED(propertyBag->Read(L"FriendlyName", &name, nullptr))) description = QString::fromWCharArray(name.bstrVal); VariantClear(&name); propertyBag->Release(); @@ -117,11 +115,11 @@ void DirectShowAudioEndpointControl::setActiveOutput(const QString &name) return; if (IMoniker *moniker = m_devices.value(name, 0)) { - IBaseFilter *filter = 0; + IBaseFilter *filter = nullptr; if (moniker->BindToObject( m_bindContext, - 0, + nullptr, IID_IBaseFilter, reinterpret_cast<void **>(&filter)) == S_OK) { m_service->setAudioOutput(filter); @@ -133,15 +131,15 @@ void DirectShowAudioEndpointControl::setActiveOutput(const QString &name) void DirectShowAudioEndpointControl::updateEndpoints() { - IMalloc *oleMalloc = 0; + IMalloc *oleMalloc = nullptr; if (m_deviceEnumerator && CoGetMalloc(1, &oleMalloc) == S_OK) { - IEnumMoniker *monikers = 0; + IEnumMoniker *monikers = nullptr; if (m_deviceEnumerator->CreateClassEnumerator( CLSID_AudioRendererCategory, &monikers, 0) == S_OK) { - for (IMoniker *moniker = 0; monikers->Next(1, &moniker, 0) == S_OK; moniker->Release()) { - OLECHAR *string = 0; - if (moniker->GetDisplayName(m_bindContext, 0, &string) == S_OK) { + for (IMoniker *moniker = nullptr; monikers->Next(1, &moniker, nullptr) == S_OK; moniker->Release()) { + OLECHAR *string = nullptr; + if (moniker->GetDisplayName(m_bindContext, nullptr, &string) == S_OK) { QString deviceId = QString::fromWCharArray(string); oleMalloc->Free(string); diff --git a/src/plugins/directshow/player/directshowaudioendpointcontrol.h b/src/plugins/directshow/player/directshowaudioendpointcontrol.h index b6f8a6724..05c4eb990 100644 --- a/src/plugins/directshow/player/directshowaudioendpointcontrol.h +++ b/src/plugins/directshow/player/directshowaudioendpointcontrol.h @@ -52,7 +52,7 @@ class DirectShowAudioEndpointControl : public QAudioOutputSelectorControl { Q_OBJECT public: - DirectShowAudioEndpointControl(DirectShowPlayerService *service, QObject *parent = 0); + DirectShowAudioEndpointControl(DirectShowPlayerService *service, QObject *parent = nullptr); ~DirectShowAudioEndpointControl() override; QList<QString> availableOutputs() const override; @@ -68,8 +68,8 @@ private: void updateEndpoints(); DirectShowPlayerService *m_service; - IBindCtx *m_bindContext; - ICreateDevEnum *m_deviceEnumerator; + IBindCtx *m_bindContext = nullptr; + ICreateDevEnum *m_deviceEnumerator = nullptr; QMap<QString, IMoniker *> m_devices; QString m_defaultEndpoint; diff --git a/src/plugins/directshow/player/directshowevrvideowindowcontrol.cpp b/src/plugins/directshow/player/directshowevrvideowindowcontrol.cpp index 57d88326c..89bfc1467 100644 --- a/src/plugins/directshow/player/directshowevrvideowindowcontrol.cpp +++ b/src/plugins/directshow/player/directshowevrvideowindowcontrol.cpp @@ -43,7 +43,6 @@ DirectShowEvrVideoWindowControl::DirectShowEvrVideoWindowControl(QObject *parent) : EvrVideoWindowControl(parent) - , m_evrFilter(nullptr) { } diff --git a/src/plugins/directshow/player/directshowevrvideowindowcontrol.h b/src/plugins/directshow/player/directshowevrvideowindowcontrol.h index fb661780f..edbde78d6 100644 --- a/src/plugins/directshow/player/directshowevrvideowindowcontrol.h +++ b/src/plugins/directshow/player/directshowevrvideowindowcontrol.h @@ -49,13 +49,13 @@ QT_BEGIN_NAMESPACE class DirectShowEvrVideoWindowControl : public EvrVideoWindowControl { public: - DirectShowEvrVideoWindowControl(QObject *parent = 0); + DirectShowEvrVideoWindowControl(QObject *parent = nullptr); ~DirectShowEvrVideoWindowControl(); IBaseFilter *filter(); private: - IBaseFilter *m_evrFilter; + IBaseFilter *m_evrFilter = nullptr; }; QT_END_NAMESPACE diff --git a/src/plugins/directshow/player/directshowioreader.cpp b/src/plugins/directshow/player/directshowioreader.cpp index c10d9a239..ced10ea10 100644 --- a/src/plugins/directshow/player/directshowioreader.cpp +++ b/src/plugins/directshow/player/directshowioreader.cpp @@ -55,25 +55,23 @@ class DirectShowSampleRequest public: DirectShowSampleRequest( IMediaSample *sample, DWORD_PTR userData, LONGLONG position, LONG length, BYTE *buffer) - : next(0) - , sample(sample) + : sample(sample) , userData(userData) , position(position) , length(length) , buffer(buffer) - , result(S_FALSE) { } DirectShowSampleRequest *remove() { DirectShowSampleRequest *n = next; delete this; return n; } - DirectShowSampleRequest *next; + DirectShowSampleRequest *next = nullptr; IMediaSample *sample; DWORD_PTR userData; LONGLONG position; LONG length; BYTE *buffer; - HRESULT result; + HRESULT result = S_FALSE; }; DirectShowIOReader::DirectShowIOReader( @@ -81,18 +79,6 @@ DirectShowIOReader::DirectShowIOReader( : m_source(source) , m_device(device) , m_loop(loop) - , m_pendingHead(0) - , m_pendingTail(0) - , m_readyHead(0) - , m_readyTail(0) - , m_synchronousPosition(0) - , m_synchronousLength(0) - , m_synchronousBytesRead(0) - , m_synchronousBuffer(0) - , m_synchronousResult(S_OK) - , m_totalLength(0) - , m_availableLength(0) - , m_flushing(false) { moveToThread(device->thread()); @@ -204,21 +190,21 @@ HRESULT DirectShowIOReader::WaitForNext( m_readyHead = request->next; if (!m_readyHead) - m_readyTail = 0; + m_readyTail = nullptr; delete request; return hr; } if (m_flushing) { - *ppSample = 0; + *ppSample = nullptr; *pdwUser = 0; return VFW_E_WRONG_STATE; } } while (m_wait.wait(&m_mutex, dwTimeout)); - *ppSample = 0; + *ppSample = nullptr; *pdwUser = 0; return VFW_E_TIMEOUT; @@ -373,10 +359,10 @@ void DirectShowIOReader::readyRead() m_pendingHead = m_pendingHead->next; - m_readyTail->next = 0; + m_readyTail->next = nullptr; if (!m_pendingHead) - m_pendingTail = 0; + m_pendingTail = nullptr; if (!m_readyHead) m_readyHead = m_readyTail; @@ -463,10 +449,10 @@ void DirectShowIOReader::flushRequests() m_pendingHead = m_pendingHead->next; - m_readyTail->next = 0; + m_readyTail->next = nullptr; if (!m_pendingHead) - m_pendingTail = 0; + m_pendingTail = nullptr; if (!m_readyHead) m_readyHead = m_readyTail; diff --git a/src/plugins/directshow/player/directshowioreader.h b/src/plugins/directshow/player/directshowioreader.h index 550990648..a0f2d7adb 100644 --- a/src/plugins/directshow/player/directshowioreader.h +++ b/src/plugins/directshow/player/directshowioreader.h @@ -99,18 +99,18 @@ private: DirectShowIOSource *m_source; QIODevice *m_device; DirectShowEventLoop *m_loop; - DirectShowSampleRequest *m_pendingHead; - DirectShowSampleRequest *m_pendingTail; - DirectShowSampleRequest *m_readyHead; - DirectShowSampleRequest *m_readyTail; - LONGLONG m_synchronousPosition; - LONG m_synchronousLength; - qint64 m_synchronousBytesRead; - BYTE *m_synchronousBuffer; - HRESULT m_synchronousResult; - LONGLONG m_totalLength; - LONGLONG m_availableLength; - bool m_flushing; + DirectShowSampleRequest *m_pendingHead = nullptr; + DirectShowSampleRequest *m_pendingTail = nullptr; + DirectShowSampleRequest *m_readyHead = nullptr; + DirectShowSampleRequest *m_readyTail = nullptr; + LONGLONG m_synchronousPosition = 0; + LONG m_synchronousLength = 0; + qint64 m_synchronousBytesRead = 0; + BYTE *m_synchronousBuffer = nullptr; + HRESULT m_synchronousResult = S_OK; + LONGLONG m_totalLength = 0; + LONGLONG m_availableLength = 0; + bool m_flushing = false; QMutex m_mutex; QWaitCondition m_wait; }; diff --git a/src/plugins/directshow/player/directshowiosource.cpp b/src/plugins/directshow/player/directshowiosource.cpp index d5833fafc..5144710b7 100644 --- a/src/plugins/directshow/player/directshowiosource.cpp +++ b/src/plugins/directshow/player/directshowiosource.cpp @@ -66,16 +66,7 @@ static const GUID directshow_subtypes[] = }; DirectShowIOSource::DirectShowIOSource(DirectShowEventLoop *loop) - : m_ref(1) - , m_state(State_Stopped) - , m_reader(0) - , m_loop(loop) - , m_graph(0) - , m_clock(0) - , m_allocator(0) - , m_peerPin(0) - , m_pinId(QLatin1String("Data")) - , m_queriedForAsyncReader(false) + : m_loop(loop) { // This filter has only one possible output type, that is, a stream of data // with no particular subtype. The graph builder will try every demux/decode filters @@ -92,9 +83,9 @@ DirectShowIOSource::DirectShowIOSource(DirectShowEventLoop *loop) FALSE, // bTemporalCompression 1, // lSampleSize GUID_NULL, // formattype - 0, // pUnk + nullptr, // pUnk 0, // cbFormat - 0, // pbFormat + nullptr, // pbFormat }; for (const auto &directshowSubtype : directshow_subtypes) { @@ -152,7 +143,7 @@ HRESULT DirectShowIOSource::QueryInterface(REFIID riid, void **ppvObject) m_queriedForAsyncReader = true; *ppvObject = static_cast<IAsyncReader *>(m_reader); } else { - *ppvObject = 0; + *ppvObject = nullptr; return E_NOINTERFACE; } @@ -381,7 +372,7 @@ HRESULT DirectShowIOSource::Connect(IPin *pReceivePin, const AM_MEDIA_TYPE *pmt) pReceivePin->Disconnect(); if (m_allocator) { m_allocator->Release(); - m_allocator = 0; + m_allocator = nullptr; } if (!m_queriedForAsyncReader) hr = VFW_E_NO_TRANSPORT; diff --git a/src/plugins/directshow/player/directshowiosource.h b/src/plugins/directshow/player/directshowiosource.h index 02639de7c..837842518 100644 --- a/src/plugins/directshow/player/directshowiosource.h +++ b/src/plugins/directshow/player/directshowiosource.h @@ -119,19 +119,19 @@ public: HRESULT STDMETHODCALLTYPE QueryDirection(PIN_DIRECTION *pPinDir) override; private: - volatile LONG m_ref; - FILTER_STATE m_state; - DirectShowIOReader *m_reader; + volatile LONG m_ref = 1; + FILTER_STATE m_state = State_Stopped; + DirectShowIOReader *m_reader = nullptr; DirectShowEventLoop *m_loop; - IFilterGraph *m_graph; - IReferenceClock *m_clock; - IMemAllocator *m_allocator; - IPin *m_peerPin; + IFilterGraph *m_graph = nullptr; + IReferenceClock *m_clock = nullptr; + IMemAllocator *m_allocator = nullptr; + IPin *m_peerPin = nullptr; DirectShowMediaType m_connectionMediaType; QList<DirectShowMediaType> m_supportedMediaTypes; QString m_filterName; - const QString m_pinId; - bool m_queriedForAsyncReader; + const QString m_pinId = QLatin1String("Data"); + bool m_queriedForAsyncReader = false; QMutex m_mutex; }; diff --git a/src/plugins/directshow/player/directshowmetadatacontrol.cpp b/src/plugins/directshow/player/directshowmetadatacontrol.cpp index 52b73a7df..46674143e 100644 --- a/src/plugins/directshow/player/directshowmetadatacontrol.cpp +++ b/src/plugins/directshow/player/directshowmetadatacontrol.cpp @@ -209,7 +209,7 @@ static QString nameForGUIDString(const QString &guid) } typedef HRESULT (WINAPI *q_SHCreateItemFromParsingName)(PCWSTR, IBindCtx *, const GUID&, void **); -static q_SHCreateItemFromParsingName sHCreateItemFromParsingName = 0; +static q_SHCreateItemFromParsingName sHCreateItemFromParsingName = nullptr; #endif #if QT_CONFIG(wmsdk) @@ -225,7 +225,7 @@ namespace }; } -typedef QList<QWMMetaDataKey> QWMMetaDataKeys; +using QWMMetaDataKeys = QList<QWMMetaDataKey>; Q_GLOBAL_STATIC(QWMMetaDataKeys, metadataKeys) static const QWMMetaDataKeys *qt_wmMetaDataKeys() @@ -299,7 +299,7 @@ static QVariant getValue(IWMHeaderInfo *header, const wchar_t *key) WMT_ATTR_DATATYPE type = WMT_TYPE_DWORD; WORD size = 0; - if (header->GetAttributeByName(&streamNumber, key, &type, 0, &size) == S_OK) { + if (header->GetAttributeByName(&streamNumber, key, &type, nullptr, &size) == S_OK) { switch (type) { case WMT_TYPE_DWORD: if (size == sizeof(DWORD)) { @@ -445,7 +445,6 @@ static QVariant convertValue(const PROPVARIANT& var) DirectShowMetaDataControl::DirectShowMetaDataControl(QObject *parent) : QMetaDataReaderControl(parent) - , m_available(false) { } @@ -472,7 +471,7 @@ static QString convertBSTR(BSTR *string) ::SysStringLen(*string)); ::SysFreeString(*string); - string = 0; + string = nullptr; return value; } @@ -492,11 +491,11 @@ void DirectShowMetaDataControl::updateMetadata(const QString &fileSrc, QVariantM } if (!fileSrc.isEmpty() && sHCreateItemFromParsingName) { - IShellItem2* shellItem = 0; + IShellItem2* shellItem = nullptr; if (sHCreateItemFromParsingName(reinterpret_cast<const WCHAR*>(fileSrc.utf16()), - 0, IID_PPV_ARGS(&shellItem)) == S_OK) { + nullptr, IID_PPV_ARGS(&shellItem)) == S_OK) { - IPropertyStore *pStore = 0; + IPropertyStore *pStore = nullptr; if (shellItem->GetPropertyStore(GPS_DEFAULT, IID_PPV_ARGS(&pStore)) == S_OK) { DWORD cProps; if (SUCCEEDED(pStore->GetCount(&cProps))) { @@ -651,17 +650,17 @@ void DirectShowMetaDataControl::updateMetadata(IFilterGraph2 *graph, IBaseFilter return; #endif { - IAMMediaContent *content = 0; + IAMMediaContent *content = nullptr; if ((!graph || graph->QueryInterface( IID_IAMMediaContent, reinterpret_cast<void **>(&content)) != S_OK) && (!source || source->QueryInterface( IID_IAMMediaContent, reinterpret_cast<void **>(&content)) != S_OK)) { - content = 0; + content = nullptr; } if (content) { - BSTR string = 0; + BSTR string = nullptr; if (content->get_AuthorName(&string) == S_OK) metadata.insert(QMediaMetaData::Author, convertBSTR(&string)); diff --git a/src/plugins/directshow/player/directshowmetadatacontrol.h b/src/plugins/directshow/player/directshowmetadatacontrol.h index 4196a7950..e66127ab3 100644 --- a/src/plugins/directshow/player/directshowmetadatacontrol.h +++ b/src/plugins/directshow/player/directshowmetadatacontrol.h @@ -54,7 +54,7 @@ class DirectShowMetaDataControl : public QMetaDataReaderControl { Q_OBJECT public: - DirectShowMetaDataControl(QObject *parent = 0); + DirectShowMetaDataControl(QObject *parent = nullptr); ~DirectShowMetaDataControl() override; bool isMetaDataAvailable() const override; @@ -76,7 +76,7 @@ private: }; QVariantMap m_metadata; - bool m_available; + bool m_available = false; }; QT_END_NAMESPACE diff --git a/src/plugins/directshow/player/directshowplayercontrol.cpp b/src/plugins/directshow/player/directshowplayercontrol.cpp index 8fddc2102..50e8d6421 100644 --- a/src/plugins/directshow/player/directshowplayercontrol.cpp +++ b/src/plugins/directshow/player/directshowplayercontrol.cpp @@ -50,20 +50,6 @@ DirectShowPlayerControl::DirectShowPlayerControl(DirectShowPlayerService *service, QObject *parent) : QMediaPlayerControl(parent) , m_service(service) - , m_audio(0) - , m_stream(0) - , m_updateProperties(0) - , m_state(QMediaPlayer::StoppedState) - , m_status(QMediaPlayer::NoMedia) - , m_error(QMediaPlayer::NoError) - , m_streamTypes(0) - , m_volume(100) - , m_muted(false) - , m_emitPosition(-1) - , m_pendingPosition(-1) - , m_duration(0) - , m_playbackRate(0) - , m_seekable(false) { } diff --git a/src/plugins/directshow/player/directshowplayercontrol.h b/src/plugins/directshow/player/directshowplayercontrol.h index dba9ab9a0..122f5be2f 100644 --- a/src/plugins/directshow/player/directshowplayercontrol.h +++ b/src/plugins/directshow/player/directshowplayercontrol.h @@ -55,7 +55,7 @@ class DirectShowPlayerControl : public QMediaPlayerControl { Q_OBJECT public: - DirectShowPlayerControl(DirectShowPlayerService *service, QObject *parent = 0); + DirectShowPlayerControl(DirectShowPlayerService *service, QObject *parent = nullptr); ~DirectShowPlayerControl() override; QMediaPlayer::State state() const override; @@ -129,20 +129,20 @@ private: void setVolumeHelper(int volume); DirectShowPlayerService *m_service; - IBasicAudio *m_audio; - QIODevice *m_stream; - int m_updateProperties; - QMediaPlayer::State m_state; - QMediaPlayer::MediaStatus m_status; - QMediaPlayer::Error m_error; - int m_streamTypes; - int m_volume; - bool m_muted; - qint64 m_emitPosition; - qint64 m_pendingPosition; - qint64 m_duration; - qreal m_playbackRate; - bool m_seekable; + IBasicAudio *m_audio = nullptr; + QIODevice *m_stream = nullptr; + int m_updateProperties = 0; + QMediaPlayer::State m_state = QMediaPlayer::StoppedState; + QMediaPlayer::MediaStatus m_status = QMediaPlayer::NoMedia; + QMediaPlayer::Error m_error = QMediaPlayer::NoError; + int m_streamTypes = 0; + int m_volume = 100; + bool m_muted = false; + qint64 m_emitPosition = -1; + qint64 m_pendingPosition = -1; + qint64 m_duration = 0; + qreal m_playbackRate = 0; + bool m_seekable = false; QMediaContent m_media; QString m_errorString; diff --git a/src/plugins/directshow/player/directshowplayerservice.cpp b/src/plugins/directshow/player/directshowplayerservice.cpp index ed131f0bd..3cc42dc21 100644 --- a/src/plugins/directshow/player/directshowplayerservice.cpp +++ b/src/plugins/directshow/player/directshowplayerservice.cpp @@ -123,37 +123,8 @@ private: DirectShowPlayerService::DirectShowPlayerService(QObject *parent) : QMediaService(parent) - , m_playerControl(0) - , m_metaDataControl(0) - , m_videoRendererControl(0) - , m_videoWindowControl(0) - , m_audioEndpointControl(0) - , m_audioProbeControl(nullptr) - , m_videoProbeControl(nullptr) - , m_audioSampleGrabber(nullptr) - , m_videoSampleGrabber(nullptr) - , m_taskThread(0) , m_loop(qt_directShowEventLoop()) - , m_pendingTasks(0) - , m_executingTask(0) - , m_executedTasks(0) , m_taskHandle(::CreateEvent(nullptr, FALSE, FALSE, nullptr)) - , m_eventHandle(0) - , m_graphStatus(NoMedia) - , m_stream(0) - , m_graph(0) - , m_graphBuilder(nullptr) - , m_source(0) - , m_audioOutput(0) - , m_videoOutput(0) - , m_rate(1.0) - , m_position(0) - , m_seekPosition(-1) - , m_duration(0) - , m_buffering(false) - , m_seekable(false) - , m_atEnd(false) - , m_dontCacheNextSeekResult(false) { m_playerControl = new DirectShowPlayerControl(this); m_metaDataControl = new DirectShowMetaDataControl(this); @@ -179,12 +150,12 @@ DirectShowPlayerService::~DirectShowPlayerService() if (m_audioOutput) { m_audioOutput->Release(); - m_audioOutput = 0; + m_audioOutput = nullptr; } if (m_videoOutput) { m_videoOutput->Release(); - m_videoOutput = 0; + m_videoOutput = nullptr; } delete m_playerControl; @@ -200,13 +171,13 @@ DirectShowPlayerService::~DirectShowPlayerService() QMediaControl *DirectShowPlayerService::requestControl(const char *name) { - if (qstrcmp(name, QMediaPlayerControl_iid) == 0) { + if (qstrcmp(name, QMediaPlayerControl_iid) == 0) return m_playerControl; - } else if (qstrcmp(name, QAudioOutputSelectorControl_iid) == 0) { + if (qstrcmp(name, QAudioOutputSelectorControl_iid) == 0) return m_audioEndpointControl; - } else if (qstrcmp(name, QMetaDataReaderControl_iid) == 0) { + if (qstrcmp(name, QMetaDataReaderControl_iid) == 0) return m_metaDataControl; - } else if (qstrcmp(name, QVideoRendererControl_iid) == 0) { + if (qstrcmp(name, QVideoRendererControl_iid) == 0) { if (!m_videoRendererControl && !m_videoWindowControl) { m_videoRendererControl = new DirectShowVideoRendererControl(m_loop); @@ -215,7 +186,9 @@ QMediaControl *DirectShowPlayerService::requestControl(const char *name) return m_videoRendererControl; } - } else if (qstrcmp(name, QVideoWindowControl_iid) == 0) { + return nullptr; + } + if (qstrcmp(name, QVideoWindowControl_iid) == 0) { if (!m_videoRendererControl && !m_videoWindowControl) { IBaseFilter *filter{}; @@ -239,20 +212,23 @@ QMediaControl *DirectShowPlayerService::requestControl(const char *name) return m_videoWindowControl; } - } else if (qstrcmp(name, QMediaAudioProbeControl_iid) == 0) { + return nullptr; + } + if (qstrcmp(name, QMediaAudioProbeControl_iid) == 0) { if (!m_audioProbeControl) m_audioProbeControl = new DirectShowAudioProbeControl(); m_audioProbeControl->ref(); updateAudioProbe(); return m_audioProbeControl; - } else if (qstrcmp(name, QMediaVideoProbeControl_iid) == 0) { + } + if (qstrcmp(name, QMediaVideoProbeControl_iid) == 0) { if (!m_videoProbeControl) m_videoProbeControl = new DirectShowVideoProbeControl(); m_videoProbeControl->ref(); updateVideoProbe(); return m_videoProbeControl; } - return 0; + return nullptr; } void DirectShowPlayerService::releaseControl(QMediaControl *control) @@ -261,17 +237,17 @@ void DirectShowPlayerService::releaseControl(QMediaControl *control) qWarning("QMediaService::releaseControl():" " Attempted release of null control"); } else if (control == m_videoRendererControl) { - setVideoOutput(0); + setVideoOutput(nullptr); delete m_videoRendererControl; - m_videoRendererControl = 0; + m_videoRendererControl = nullptr; } else if (control == m_videoWindowControl) { - setVideoOutput(0); + setVideoOutput(nullptr); delete m_videoWindowControl; - m_videoWindowControl = 0; + m_videoWindowControl = nullptr; } else if (control == m_audioProbeControl) { if (!m_audioProbeControl->deref()) { DirectShowAudioProbeControl *old = m_audioProbeControl; @@ -298,7 +274,7 @@ void DirectShowPlayerService::load(const QMediaContent &media, QIODevice *stream if (m_graph) releaseGraph(); - m_url = media.canonicalUrl(); + m_url = media.request().url(); m_stream = stream; m_error = QMediaPlayer::NoError; @@ -356,7 +332,7 @@ void DirectShowPlayerService::load(const QMediaContent &media, QIODevice *stream void DirectShowPlayerService::doSetUrlSource(QMutexLocker *locker) { - IBaseFilter *source = 0; + IBaseFilter *source = nullptr; HRESULT hr = E_FAIL; if (m_url.scheme() == QLatin1String("http") || m_url.scheme() == QLatin1String("https")) { @@ -369,14 +345,14 @@ void DirectShowPlayerService::doSetUrlSource(QMutexLocker *locker) if (IFileSourceFilter *fileSource = com_new<IFileSourceFilter>(clsid_WMAsfReader, iid_IFileSourceFilter)) { locker->unlock(); - hr = fileSource->Load(reinterpret_cast<const OLECHAR *>(m_url.toString().utf16()), 0); + hr = fileSource->Load(reinterpret_cast<const OLECHAR *>(m_url.toString().utf16()), nullptr); if (SUCCEEDED(hr)) { source = com_cast<IBaseFilter>(fileSource, IID_IBaseFilter); if (!SUCCEEDED(hr = m_graph->AddFilter(source, L"Source")) && source) { source->Release(); - source = 0; + source = nullptr; } } fileSource->Release(); @@ -511,18 +487,18 @@ void DirectShowPlayerService::doRender(QMutexLocker *locker) HRESULT renderHr = S_OK; while (!filters.isEmpty()) { - IEnumPins *pins = 0; + IEnumPins *pins = nullptr; IBaseFilter *filter = filters[filters.size() - 1]; filters.removeLast(); if (!(m_pendingTasks & ReleaseFilters) && SUCCEEDED(filter->EnumPins(&pins))) { int outputs = 0; - for (IPin *pin = 0; pins->Next(1, &pin, 0) == S_OK; pin->Release()) { + for (IPin *pin = nullptr; pins->Next(1, &pin, nullptr) == S_OK; pin->Release()) { PIN_DIRECTION direction; if (pin->QueryDirection(&direction) == S_OK && direction == PINDIR_OUTPUT) { ++outputs; - IPin *peer = 0; + IPin *peer = nullptr; if (pin->ConnectedTo(&peer) == S_OK) { PIN_INFO peerInfo; if (SUCCEEDED(peer->QueryPinInfo(&peerInfo))) @@ -530,7 +506,7 @@ void DirectShowPlayerService::doRender(QMutexLocker *locker) peer->Release(); } else { locker->unlock(); - HRESULT hr = graph->RenderEx(pin, /*AM_RENDEREX_RENDERTOEXISTINGRENDERERS*/ 1, 0); + HRESULT hr = graph->RenderEx(pin, /*AM_RENDEREX_RENDERTOEXISTINGRENDERERS*/ 1, nullptr); if (SUCCEEDED(hr)) { rendered = true; m_error = QMediaPlayer::NoError; @@ -686,13 +662,13 @@ void DirectShowPlayerService::doReleaseGraph(QMutexLocker *locker) if (m_source) { m_source->Release(); - m_source = 0; + m_source = nullptr; } - m_eventHandle = 0; + m_eventHandle = nullptr; m_graph->Release(); - m_graph = 0; + m_graph = nullptr; if (m_graphBuilder) { m_graphBuilder->Release(); @@ -830,17 +806,17 @@ int DirectShowPlayerService::findStreamTypes(IBaseFilter *source) const int streamTypes = 0; while (!filters.isEmpty()) { - IEnumPins *pins = 0; + IEnumPins *pins = nullptr; IBaseFilter *filter = filters[filters.size() - 1]; filters.removeLast(); if (SUCCEEDED(filter->EnumPins(&pins))) { - for (IPin *pin = 0; pins->Next(1, &pin, 0) == S_OK; pin->Release()) { + for (IPin *pin = nullptr; pins->Next(1, &pin, nullptr) == S_OK; pin->Release()) { PIN_DIRECTION direction; if (pin->QueryDirection(&direction) == S_OK && direction == PINDIR_OUTPUT) { DirectShowMediaType connectionType; if (SUCCEEDED(pin->ConnectionMediaType(&connectionType))) { - IPin *peer = 0; + IPin *peer = nullptr; if (connectionType->majortype == MEDIATYPE_Audio) { streamTypes |= AudioStream; @@ -873,8 +849,8 @@ int DirectShowPlayerService::findStreamType(IPin *pin) const bool audio = false; bool other = false; - for (AM_MEDIA_TYPE *type = 0; - types->Next(1, &type, 0) == S_OK; + for (AM_MEDIA_TYPE *type = nullptr; + types->Next(1, &type, nullptr) == S_OK; DirectShowMediaType::deleteType(type)) { if (type->majortype == MEDIATYPE_Audio) audio = true; @@ -1188,7 +1164,7 @@ void DirectShowPlayerService::doSeek(QMutexLocker *locker) locker->unlock(); seeking->SetPositions( - &seekPosition, AM_SEEKING_AbsolutePositioning, 0, AM_SEEKING_NoPositioning); + &seekPosition, AM_SEEKING_AbsolutePositioning, nullptr, AM_SEEKING_NoPositioning); locker->relock(); if (!m_dontCacheNextSeekResult) { @@ -1214,7 +1190,7 @@ int DirectShowPlayerService::bufferStatus() const m_source, IID_IWMReaderAdvanced2)) { DWORD percentage = 0; - reader->GetBufferProgress(&percentage, 0); + reader->GetBufferProgress(&percentage, nullptr); reader->Release(); return percentage; @@ -1387,7 +1363,7 @@ void DirectShowPlayerService::doReleaseVideoOutput(QMutexLocker *locker) control->Release(); } - IBaseFilter *intermediate = 0; + IBaseFilter *intermediate = nullptr; if (!SUCCEEDED(m_graph->FindFilterByName(L"Color Space Converter", &intermediate))) { intermediate = m_videoOutput; intermediate->AddRef(); @@ -1664,13 +1640,13 @@ bool DirectShowPlayerService::isConnected(IBaseFilter *filter, PIN_DIRECTION dir { bool connected = false; - IEnumPins *pins = 0; + IEnumPins *pins = nullptr; if (SUCCEEDED(filter->EnumPins(&pins))) { - for (IPin *pin = 0; pins->Next(1, &pin, 0) == S_OK; pin->Release()) { + for (IPin *pin = nullptr; pins->Next(1, &pin, nullptr) == S_OK; pin->Release()) { PIN_DIRECTION dir; if (SUCCEEDED(pin->QueryDirection(&dir)) && dir == direction) { - IPin *peer = 0; + IPin *peer = nullptr; if (SUCCEEDED(pin->ConnectedTo(&peer))) { connected = true; @@ -1686,15 +1662,15 @@ bool DirectShowPlayerService::isConnected(IBaseFilter *filter, PIN_DIRECTION dir IBaseFilter *DirectShowPlayerService::getConnected( IBaseFilter *filter, PIN_DIRECTION direction) const { - IBaseFilter *connected = 0; + IBaseFilter *connected = nullptr; - IEnumPins *pins = 0; + IEnumPins *pins = nullptr; if (SUCCEEDED(filter->EnumPins(&pins))) { - for (IPin *pin = 0; pins->Next(1, &pin, 0) == S_OK; pin->Release()) { + for (IPin *pin = nullptr; pins->Next(1, &pin, nullptr) == S_OK; pin->Release()) { PIN_DIRECTION dir; if (SUCCEEDED(pin->QueryDirection(&dir)) && dir == direction) { - IPin *peer = 0; + IPin *peer = nullptr; if (SUCCEEDED(pin->ConnectedTo(&peer))) { PIN_INFO info; diff --git a/src/plugins/directshow/player/directshowplayerservice.h b/src/plugins/directshow/player/directshowplayerservice.h index a6eeb8a77..69b4b0a6c 100644 --- a/src/plugins/directshow/player/directshowplayerservice.h +++ b/src/plugins/directshow/player/directshowplayerservice.h @@ -78,7 +78,7 @@ public: VideoStream = 0x02 }; - DirectShowPlayerService(QObject *parent = 0); + DirectShowPlayerService(QObject *parent = nullptr); ~DirectShowPlayerService() override; QMediaControl *requestControl(const char *name) override; @@ -193,44 +193,44 @@ private: InvalidMedia }; - DirectShowPlayerControl *m_playerControl; - DirectShowMetaDataControl *m_metaDataControl; - DirectShowVideoRendererControl *m_videoRendererControl; - QVideoWindowControl *m_videoWindowControl; - DirectShowAudioEndpointControl *m_audioEndpointControl; - DirectShowAudioProbeControl *m_audioProbeControl; - DirectShowVideoProbeControl *m_videoProbeControl; - DirectShowSampleGrabber *m_audioSampleGrabber; - DirectShowSampleGrabber *m_videoSampleGrabber; - - QThread *m_taskThread; + DirectShowPlayerControl *m_playerControl = nullptr; + DirectShowMetaDataControl *m_metaDataControl = nullptr; + DirectShowVideoRendererControl *m_videoRendererControl = nullptr; + QVideoWindowControl *m_videoWindowControl = nullptr; + DirectShowAudioEndpointControl *m_audioEndpointControl = nullptr; + DirectShowAudioProbeControl *m_audioProbeControl = nullptr; + DirectShowVideoProbeControl *m_videoProbeControl = nullptr; + DirectShowSampleGrabber *m_audioSampleGrabber = nullptr; + DirectShowSampleGrabber *m_videoSampleGrabber = nullptr; + + QThread *m_taskThread = nullptr; DirectShowEventLoop *m_loop; - int m_pendingTasks; - int m_executingTask; - int m_executedTasks; - int m_streamTypes; + int m_pendingTasks = 0; + int m_executingTask = 0; + int m_executedTasks = 0; + int m_streamTypes = 0; HANDLE m_taskHandle; - HANDLE m_eventHandle; - GraphStatus m_graphStatus; - QMediaPlayer::Error m_error; - QIODevice *m_stream; - IFilterGraph2 *m_graph; - ICaptureGraphBuilder2 *m_graphBuilder; - IBaseFilter *m_source; - IBaseFilter *m_audioOutput; - IBaseFilter *m_videoOutput; - qreal m_rate; - qint64 m_position; - qint64 m_seekPosition; - qint64 m_duration; + HANDLE m_eventHandle = nullptr; + GraphStatus m_graphStatus = NoMedia; + QMediaPlayer::Error m_error = QMediaPlayer::NoError; + QIODevice *m_stream = nullptr; + IFilterGraph2 *m_graph = nullptr; + ICaptureGraphBuilder2 *m_graphBuilder = nullptr; + IBaseFilter *m_source = nullptr; + IBaseFilter *m_audioOutput = nullptr; + IBaseFilter *m_videoOutput = nullptr; + qreal m_rate = 1; + qint64 m_position = 0; + qint64 m_seekPosition = -1; + qint64 m_duration = 0; QMediaTimeRange m_playbackRange; QUrl m_url; QString m_errorString; QMutex m_mutex; - bool m_buffering; - bool m_seekable; - bool m_atEnd; - bool m_dontCacheNextSeekResult; + bool m_buffering = false; + bool m_seekable = false; + bool m_atEnd = false; + bool m_dontCacheNextSeekResult = false; QVariantMap m_metadata; friend class DirectShowPlayerServiceThread; diff --git a/src/plugins/directshow/player/directshowvideorenderercontrol.cpp b/src/plugins/directshow/player/directshowvideorenderercontrol.cpp index bbf7cf8b9..0b1f0de2f 100644 --- a/src/plugins/directshow/player/directshowvideorenderercontrol.cpp +++ b/src/plugins/directshow/player/directshowvideorenderercontrol.cpp @@ -51,11 +51,6 @@ DirectShowVideoRendererControl::DirectShowVideoRendererControl(DirectShowEventLoop *loop, QObject *parent) : QVideoRendererControl(parent) , m_loop(loop) - , m_surface(0) - , m_filter(0) -#if QT_CONFIG(evr) - , m_evrPresenter(0) -#endif { } @@ -85,13 +80,13 @@ void DirectShowVideoRendererControl::setSurface(QAbstractVideoSurface *surface) if (m_evrPresenter) { m_evrPresenter->setSurface(nullptr); m_evrPresenter->Release(); - m_evrPresenter = 0; + m_evrPresenter = nullptr; } #endif if (m_filter) { m_filter->Release(); - m_filter = 0; + m_filter = nullptr; } m_surface = surface; @@ -104,9 +99,9 @@ void DirectShowVideoRendererControl::setSurface(QAbstractVideoSurface *surface) connect(this, &DirectShowVideoRendererControl::positionChanged, m_evrPresenter, &EVRCustomPresenter::positionChanged); if (!m_evrPresenter->isValid() || !qt_evr_setCustomPresenter(m_filter, m_evrPresenter)) { m_filter->Release(); - m_filter = 0; + m_filter = nullptr; m_evrPresenter->Release(); - m_evrPresenter = 0; + m_evrPresenter = nullptr; } } diff --git a/src/plugins/directshow/player/directshowvideorenderercontrol.h b/src/plugins/directshow/player/directshowvideorenderercontrol.h index 930f8a6b1..9326a2748 100644 --- a/src/plugins/directshow/player/directshowvideorenderercontrol.h +++ b/src/plugins/directshow/player/directshowvideorenderercontrol.h @@ -58,7 +58,7 @@ class DirectShowVideoRendererControl : public QVideoRendererControl { Q_OBJECT public: - DirectShowVideoRendererControl(DirectShowEventLoop *loop, QObject *parent = 0); + DirectShowVideoRendererControl(DirectShowEventLoop *loop, QObject *parent = nullptr); ~DirectShowVideoRendererControl() override; QAbstractVideoSurface *surface() const override; @@ -72,10 +72,10 @@ Q_SIGNALS: private: DirectShowEventLoop *m_loop; - QAbstractVideoSurface *m_surface; - IBaseFilter *m_filter; + QAbstractVideoSurface *m_surface = nullptr; + IBaseFilter *m_filter = nullptr; #if QT_CONFIG(evr) - EVRCustomPresenter *m_evrPresenter; + EVRCustomPresenter *m_evrPresenter = nullptr; #endif }; diff --git a/src/plugins/directshow/player/videosurfacefilter.cpp b/src/plugins/directshow/player/videosurfacefilter.cpp index 4702d5908..4b7afc266 100644 --- a/src/plugins/directshow/player/videosurfacefilter.cpp +++ b/src/plugins/directshow/player/videosurfacefilter.cpp @@ -47,6 +47,8 @@ #include <QtCore/qloggingcategory.h> #include <qabstractvideosurface.h> +#include <mutex> + #include <initguid.h> QT_BEGIN_NAMESPACE @@ -154,7 +156,7 @@ HRESULT VideoSurfaceInputPin::Disconnect() HRESULT VideoSurfaceInputPin::EndOfStream() { QMutexLocker lock(&m_videoSurfaceFilter->m_mutex); - QMutexLocker renderLock(&m_videoSurfaceFilter->m_renderMutex); + const std::lock_guard<QRecursiveMutex> renderLocker(m_videoSurfaceFilter->m_renderMutex); HRESULT hr = DirectShowInputPin::EndOfStream(); if (hr != S_OK) @@ -167,7 +169,7 @@ HRESULT VideoSurfaceInputPin::BeginFlush() { QMutexLocker lock(&m_videoSurfaceFilter->m_mutex); { - QMutexLocker renderLock(&m_videoSurfaceFilter->m_renderMutex); + const std::lock_guard<QRecursiveMutex> renderLocker(m_videoSurfaceFilter->m_renderMutex); DirectShowInputPin::BeginFlush(); m_videoSurfaceFilter->BeginFlush(); } @@ -179,7 +181,7 @@ HRESULT VideoSurfaceInputPin::BeginFlush() HRESULT VideoSurfaceInputPin::EndFlush() { QMutexLocker lock(&m_videoSurfaceFilter->m_mutex); - QMutexLocker renderLock(&m_videoSurfaceFilter->m_renderMutex); + const std::lock_guard<QRecursiveMutex> renderLocker(m_videoSurfaceFilter->m_renderMutex); HRESULT hr = m_videoSurfaceFilter->EndFlush(); if (SUCCEEDED(hr)) @@ -207,7 +209,7 @@ HRESULT VideoSurfaceInputPin::Receive(IMediaSample *pMediaSample) if (m_videoSurfaceFilter->state() != State_Stopped && !m_flushing && !m_inErrorState) { m_videoSurfaceFilter->NotifyEvent(EC_ERRORABORT, hr, 0); { - QMutexLocker renderLocker(&m_videoSurfaceFilter->m_renderMutex); + const std::lock_guard<QRecursiveMutex> renderLocker(m_videoSurfaceFilter->m_renderMutex); if (m_videoSurfaceFilter->m_running && !m_videoSurfaceFilter->m_EOSDelivered) m_videoSurfaceFilter->notifyEOS(); } @@ -222,20 +224,9 @@ HRESULT VideoSurfaceInputPin::Receive(IMediaSample *pMediaSample) VideoSurfaceFilter::VideoSurfaceFilter(QAbstractVideoSurface *surface, DirectShowEventLoop *loop, QObject *parent) : QObject(parent) , m_loop(loop) - , m_pin(nullptr) , m_surface(surface) - , m_bytesPerLine(0) - , m_surfaceStarted(false) - , m_renderMutex(QMutex::Recursive) - , m_running(false) - , m_pendingSample(nullptr) - , m_pendingSampleEndTime(0) , m_renderEvent(CreateEvent(nullptr, FALSE, FALSE, nullptr)) , m_flushEvent(CreateEvent(nullptr, TRUE, FALSE, nullptr)) - , m_adviseCookie(0) - , m_EOS(false) - , m_EOSDelivered(false) - , m_EOSTimer(0) { supportedFormatsChanged(); connect(surface, &QAbstractVideoSurface::supportedFormatsChanged, @@ -376,7 +367,7 @@ HRESULT VideoSurfaceFilter::Run(REFERENCE_TIME tStart) allocator->Release(); } - QMutexLocker renderLocker(&m_renderMutex); + const std::lock_guard<QRecursiveMutex> renderLocker(m_renderMutex); m_running = true; @@ -453,7 +444,7 @@ HRESULT VideoSurfaceFilter::Stop() HRESULT VideoSurfaceFilter::EndOfStream() { - QMutexLocker renderLocker(&m_renderMutex); + const std::lock_guard<QRecursiveMutex> renderLocker(m_renderMutex); qCDebug(qLcRenderFilter, "EndOfStream"); @@ -509,7 +500,7 @@ HRESULT VideoSurfaceFilter::Receive(IMediaSample *pMediaSample) } { - QMutexLocker locker(&m_renderMutex); + const std::lock_guard<QRecursiveMutex> locker(m_renderMutex); if (m_pendingSample || m_EOS) return E_UNEXPECTED; @@ -553,13 +544,13 @@ HRESULT VideoSurfaceFilter::Receive(IMediaSample *pMediaSample) return S_OK; } - QMutexLocker renderLock(&m_renderMutex); + std::unique_lock<QRecursiveMutex> renderLocker(m_renderMutex); // Flush or pause might have happened just before the lock if (m_pendingSample && m_running) { - renderLock.unlock(); + renderLocker.unlock(); renderPendingSample(); - renderLock.relock(); + renderLocker.lock(); } else { qCDebug(qLcRenderFilter, " discarding sample (%p)", pMediaSample); } @@ -612,7 +603,7 @@ void VideoSurfaceFilter::unscheduleSample() void VideoSurfaceFilter::clearPendingSample() { - QMutexLocker locker(&m_renderMutex); + const std::lock_guard<QRecursiveMutex> locker(m_renderMutex); if (m_pendingSample) { qCDebug(qLcRenderFilter, "clearPendingSample"); m_pendingSample->Release(); @@ -628,7 +619,7 @@ void QT_WIN_CALLBACK EOSTimerCallback(UINT, UINT, DWORD_PTR dwUser, DWORD_PTR, D void VideoSurfaceFilter::onEOSTimerTimeout() { - QMutexLocker locker(&m_renderMutex); + const std::lock_guard<QRecursiveMutex> locker(m_renderMutex); if (m_EOSTimer) { m_EOSTimer = 0; @@ -638,7 +629,7 @@ void VideoSurfaceFilter::onEOSTimerTimeout() void VideoSurfaceFilter::checkEOS() { - QMutexLocker locker(&m_renderMutex); + const std::lock_guard<QRecursiveMutex> locker(m_renderMutex); if (!m_EOS || m_EOSDelivered || m_EOSTimer) return; @@ -673,7 +664,7 @@ void VideoSurfaceFilter::checkEOS() void VideoSurfaceFilter::notifyEOS() { - QMutexLocker locker(&m_renderMutex); + const std::lock_guard<QRecursiveMutex> locker(m_renderMutex); if (!m_running) return; @@ -689,7 +680,7 @@ void VideoSurfaceFilter::resetEOS() { resetEOSTimer(); - QMutexLocker locker(&m_renderMutex); + const std::lock_guard<QRecursiveMutex> locker(m_renderMutex); if (m_EOS) qCDebug(qLcRenderFilter, "resetEOS (delivered=%s)", m_EOSDelivered ? "true" : "false"); @@ -713,11 +704,10 @@ bool VideoSurfaceFilter::startSurface() m_loop->postEvent(this, new QEvent(QEvent::Type(StartSurface))); m_waitSurface.wait(&m_mutex); return m_surfaceStarted; - } else { - m_surfaceStarted = m_surface->start(m_surfaceFormat); - qCDebug(qLcRenderFilter, "startSurface %s", m_surfaceStarted ? "succeeded" : "failed"); - return m_surfaceStarted; } + m_surfaceStarted = m_surface->start(m_surfaceFormat); + qCDebug(qLcRenderFilter, "startSurface %s", m_surfaceStarted ? "succeeded" : "failed"); + return m_surfaceStarted; } void VideoSurfaceFilter::stopSurface() @@ -741,12 +731,11 @@ bool VideoSurfaceFilter::restartSurface() m_loop->postEvent(this, new QEvent(QEvent::Type(RestartSurface))); m_waitSurface.wait(&m_mutex); return m_surfaceStarted; - } else { - m_surface->stop(); - m_surfaceStarted = m_surface->start(m_surfaceFormat); - qCDebug(qLcRenderFilter, "restartSurface %s", m_surfaceStarted ? "succeeded" : "failed"); - return m_surfaceStarted; } + m_surface->stop(); + m_surfaceStarted = m_surface->start(m_surfaceFormat); + qCDebug(qLcRenderFilter, "restartSurface %s", m_surfaceStarted ? "succeeded" : "failed"); + return m_surfaceStarted; } void VideoSurfaceFilter::flushSurface() @@ -766,7 +755,7 @@ void VideoSurfaceFilter::renderPendingSample() m_loop->postEvent(this, new QEvent(QEvent::Type(RenderSample))); m_waitSurface.wait(&m_mutex); } else { - QMutexLocker locker(&m_renderMutex); + const std::lock_guard<QRecursiveMutex> locker(m_renderMutex); if (!m_pendingSample) return; diff --git a/src/plugins/directshow/player/videosurfacefilter.h b/src/plugins/directshow/player/videosurfacefilter.h index 56791f270..9e56f4b65 100644 --- a/src/plugins/directshow/player/videosurfacefilter.h +++ b/src/plugins/directshow/player/videosurfacefilter.h @@ -62,7 +62,7 @@ class VideoSurfaceFilter : public QObject Q_OBJECT COM_REF_MIXIN public: - VideoSurfaceFilter(QAbstractVideoSurface *surface, DirectShowEventLoop *loop, QObject *parent = 0); + VideoSurfaceFilter(QAbstractVideoSurface *surface, DirectShowEventLoop *loop, QObject *parent = nullptr); ~VideoSurfaceFilter(); STDMETHODIMP QueryInterface(REFIID riid, void **ppv) override; @@ -130,28 +130,28 @@ private: QMutex m_mutex; DirectShowEventLoop *m_loop; - VideoSurfaceInputPin *m_pin; + VideoSurfaceInputPin *m_pin = nullptr; QWaitCondition m_waitSurface; QAbstractVideoSurface *m_surface; QVideoSurfaceFormat m_surfaceFormat; - int m_bytesPerLine; - bool m_surfaceStarted; + int m_bytesPerLine = 0; + bool m_surfaceStarted = false; QList<GUID> m_supportedTypes; QReadWriteLock m_typesLock; - QMutex m_renderMutex; - bool m_running; - IMediaSample *m_pendingSample; - REFERENCE_TIME m_pendingSampleEndTime; + QRecursiveMutex m_renderMutex; + bool m_running = false; + IMediaSample *m_pendingSample = nullptr; + REFERENCE_TIME m_pendingSampleEndTime = 0; HANDLE m_renderEvent; HANDLE m_flushEvent; - DWORD_PTR m_adviseCookie; + DWORD_PTR m_adviseCookie = 0; - bool m_EOS; - bool m_EOSDelivered; - UINT m_EOSTimer; + bool m_EOS = false; + bool m_EOSDelivered = false; + UINT m_EOSTimer = 0; friend class VideoSurfaceInputPin; }; diff --git a/src/plugins/directshow/player/vmr9videowindowcontrol.cpp b/src/plugins/directshow/player/vmr9videowindowcontrol.cpp index c026a12d8..63c945622 100644 --- a/src/plugins/directshow/player/vmr9videowindowcontrol.cpp +++ b/src/plugins/directshow/player/vmr9videowindowcontrol.cpp @@ -49,15 +49,6 @@ Vmr9VideoWindowControl::Vmr9VideoWindowControl(QObject *parent) : QVideoWindowControl(parent) , m_filter(com_new<IBaseFilter>(CLSID_VideoMixingRenderer9)) - , m_windowId(0) - , m_windowColor(RGB(0, 0, 0)) - , m_dirtyValues(0) - , m_aspectRatioMode(Qt::KeepAspectRatio) - , m_brightness(0) - , m_contrast(0) - , m_hue(0) - , m_saturation(0) - , m_fullScreen(false) { if (IVMRFilterConfig9 *config = com_cast<IVMRFilterConfig9>(m_filter, IID_IVMRFilterConfig9)) { config->SetRenderingMode(VMR9Mode_Windowless); @@ -113,7 +104,7 @@ void Vmr9VideoWindowControl::setDisplayRect(const QRect &rect) RECT sourceRect = { 0, 0, 0, 0 }; RECT displayRect = { rect.left(), rect.top(), rect.right() + 1, rect.bottom() + 1 }; - control->GetNativeVideoSize(&sourceRect.right, &sourceRect.bottom, 0, 0); + control->GetNativeVideoSize(&sourceRect.right, &sourceRect.bottom, nullptr, nullptr); if (m_aspectRatioMode == Qt::KeepAspectRatioByExpanding) { QSize clippedSize = rect.size(); @@ -182,7 +173,7 @@ QSize Vmr9VideoWindowControl::nativeSize() const LONG width; LONG height; - if (control->GetNativeVideoSize(&width, &height, 0, 0) == S_OK) + if (control->GetNativeVideoSize(&width, &height, nullptr, nullptr) == S_OK) size = QSize(width, height); control->Release(); } diff --git a/src/plugins/directshow/player/vmr9videowindowcontrol.h b/src/plugins/directshow/player/vmr9videowindowcontrol.h index 8ab9bd506..2a6f008f3 100644 --- a/src/plugins/directshow/player/vmr9videowindowcontrol.h +++ b/src/plugins/directshow/player/vmr9videowindowcontrol.h @@ -52,7 +52,7 @@ class Vmr9VideoWindowControl : public QVideoWindowControl { Q_OBJECT public: - Vmr9VideoWindowControl(QObject *parent = 0); + Vmr9VideoWindowControl(QObject *parent = nullptr); ~Vmr9VideoWindowControl() override; IBaseFilter *filter() const { return m_filter; } @@ -91,16 +91,16 @@ private: IVMRMixerControl9 *control, VMR9ProcAmpControlFlags property, int value) const; IBaseFilter *m_filter; - WId m_windowId; - COLORREF m_windowColor; - DWORD m_dirtyValues; - Qt::AspectRatioMode m_aspectRatioMode; + WId m_windowId = 0; + COLORREF m_windowColor = RGB(0, 0, 0); + DWORD m_dirtyValues = 0; + Qt::AspectRatioMode m_aspectRatioMode = Qt::KeepAspectRatio; QRect m_displayRect; - int m_brightness; - int m_contrast; - int m_hue; - int m_saturation; - bool m_fullScreen; + int m_brightness = 0; + int m_contrast = 0; + int m_hue = 0; + int m_saturation = 0; + bool m_fullScreen = false; }; QT_END_NAMESPACE diff --git a/src/plugins/gstreamer/camerabin/camerabincontrol.cpp b/src/plugins/gstreamer/camerabin/camerabincontrol.cpp index a34315b8a..fdf3ff4ac 100644 --- a/src/plugins/gstreamer/camerabin/camerabincontrol.cpp +++ b/src/plugins/gstreamer/camerabin/camerabincontrol.cpp @@ -121,7 +121,7 @@ void CameraBinControl::setState(QCamera::State state) //special case for stopping the camera while it's busy, //it should be delayed until the camera is idle - if (state == QCamera::LoadedState && + if ((state == QCamera::LoadedState || state == QCamera::UnloadedState) && m_session->status() == QCamera::ActiveStatus && m_session->isBusy()) { #ifdef CAMEABIN_DEBUG diff --git a/src/plugins/gstreamer/camerabin/camerabinimagecapture.cpp b/src/plugins/gstreamer/camerabin/camerabinimagecapture.cpp index 29d7743ed..52ec75f44 100644 --- a/src/plugins/gstreamer/camerabin/camerabinimagecapture.cpp +++ b/src/plugins/gstreamer/camerabin/camerabinimagecapture.cpp @@ -149,9 +149,7 @@ gboolean CameraBinImageCapture::encoderEventProbe( tags[QMediaMetaData::FNumber] = extendedTags.value("capturing-focal-ratio"); tags[QMediaMetaData::ExposureMode] = extendedTags.value("capturing-exposure-mode"); - QMapIterator<QString, QVariant> i(tags); - while (i.hasNext()) { - i.next(); + for (auto i = tags.cbegin(), end = tags.cend(); i != end; ++i) { if (i.value().isValid()) { QMetaObject::invokeMethod(self, "imageMetadataAvailable", Qt::QueuedConnection, diff --git a/src/plugins/gstreamer/mediacapture/qgstreameraudioencode.cpp b/src/plugins/gstreamer/mediacapture/qgstreameraudioencode.cpp index 6a0816343..1a35c5cf6 100644 --- a/src/plugins/gstreamer/mediacapture/qgstreameraudioencode.cpp +++ b/src/plugins/gstreamer/mediacapture/qgstreameraudioencode.cpp @@ -204,11 +204,9 @@ GstElement *QGstreamerAudioEncode::createEncoder() } QMap<QString, QVariant> options = m_options.value(codec); - QMapIterator<QString,QVariant> it(options); - while (it.hasNext()) { - it.next(); - QString option = it.key(); - QVariant value = it.value(); + for (auto it = options.cbegin(), end = options.cend(); it != end; ++it) { + const QString &option = it.key(); + const QVariant &value = it.value(); switch (value.type()) { case QVariant::Int: diff --git a/src/plugins/gstreamer/mediacapture/qgstreamervideoencode.cpp b/src/plugins/gstreamer/mediacapture/qgstreamervideoencode.cpp index 62d9bbd8c..a2ed1d288 100644 --- a/src/plugins/gstreamer/mediacapture/qgstreamervideoencode.cpp +++ b/src/plugins/gstreamer/mediacapture/qgstreamervideoencode.cpp @@ -195,11 +195,9 @@ GstElement *QGstreamerVideoEncode::createEncoder() } QMap<QString,QVariant> options = m_options.value(codec); - QMapIterator<QString,QVariant> it(options); - while (it.hasNext()) { - it.next(); - QString option = it.key(); - QVariant value = it.value(); + for (auto it = options.cbegin(), end = options.cend(); it != end; ++it) { + const QString &option = it.key(); + const QVariant &value = it.value(); switch (value.type()) { case QVariant::Int: diff --git a/src/plugins/gstreamer/mediaplayer/qgstreamermetadataprovider.cpp b/src/plugins/gstreamer/mediaplayer/qgstreamermetadataprovider.cpp index 8f2f6643c..bd503d3a1 100644 --- a/src/plugins/gstreamer/mediaplayer/qgstreamermetadataprovider.cpp +++ b/src/plugins/gstreamer/mediaplayer/qgstreamermetadataprovider.cpp @@ -167,9 +167,8 @@ void QGstreamerMetaDataProvider::updateTags() m_tags.clear(); bool changed = false; - QMapIterator<QByteArray ,QVariant> i(m_session->tags()); - while (i.hasNext()) { - i.next(); + const auto tags = m_session->tags(); + for (auto i = tags.cbegin(), end = tags.cend(); i != end; ++i) { //use gstreamer native keys for elements not in our key map QString key = qt_gstreamerMetaDataKeys()->value(i.key(), i.key()); m_tags.insert(key, i.value()); diff --git a/src/plugins/gstreamer/mediaplayer/qgstreamerplayerservice.cpp b/src/plugins/gstreamer/mediaplayer/qgstreamerplayerservice.cpp index 44cb5439b..4bf4a0a57 100644 --- a/src/plugins/gstreamer/mediaplayer/qgstreamerplayerservice.cpp +++ b/src/plugins/gstreamer/mediaplayer/qgstreamerplayerservice.cpp @@ -55,10 +55,6 @@ #include <private/qgstreamervideowindow_p.h> #include <private/qgstreamervideorenderer_p.h> -#if QT_CONFIG(mirclient) && defined (__arm__) -#include "private/qgstreamermirtexturerenderer_p.h" -#endif - #include "qgstreamerstreamscontrol.h" #include <private/qgstreameraudioprobecontrol_p.h> #include <private/qgstreamervideoprobecontrol_p.h> @@ -79,13 +75,7 @@ QGstreamerPlayerService::QGstreamerPlayerService(QObject *parent) m_metaData = new QGstreamerMetaDataProvider(m_session, this); m_streamsControl = new QGstreamerStreamsControl(m_session,this); m_availabilityControl = new QGStreamerAvailabilityControl(m_control->resources(), this); - -#if QT_CONFIG(mirclient) && defined (__arm__) - m_videoRenderer = new QGstreamerMirTextureRenderer(this, m_session); -#else m_videoRenderer = new QGstreamerVideoRenderer(this); -#endif - m_videoWindow = new QGstreamerVideoWindow(this); // If the GStreamer video sink is not available, don't provide the video window control since // it won't work anyway. diff --git a/src/plugins/m3u/qm3uhandler.cpp b/src/plugins/m3u/qm3uhandler.cpp index bc5366bf6..017c32d92 100644 --- a/src/plugins/m3u/qm3uhandler.cpp +++ b/src/plugins/m3u/qm3uhandler.cpp @@ -163,7 +163,7 @@ public: virtual bool writeItem(const QMediaContent& item) { - *m_textStream << item.canonicalUrl().toString() << endl; + *m_textStream << item.request().url().toString() << endl; return true; } diff --git a/src/plugins/pulseaudio/qaudioinput_pulse.h b/src/plugins/pulseaudio/qaudioinput_pulse.h index 32a2c031c..3a6cf03c4 100644 --- a/src/plugins/pulseaudio/qaudioinput_pulse.h +++ b/src/plugins/pulseaudio/qaudioinput_pulse.h @@ -55,7 +55,7 @@ #include <QtCore/qtimer.h> #include <QtCore/qstring.h> #include <QtCore/qstringlist.h> -#include <QtCore/qdatetime.h> +#include <QtCore/qelapsedtimer.h> #include <QtCore/qiodevice.h> #include "qaudio.h" @@ -132,8 +132,8 @@ private: QTimer *m_timer; qint64 m_elapsedTimeOffset; pa_stream *m_stream; - QTime m_timeStamp; - QTime m_clockStamp; + QElapsedTimer m_timeStamp; + QElapsedTimer m_clockStamp; QByteArray m_streamName; QByteArray m_device; QByteArray m_tempBuffer; diff --git a/src/plugins/qnx/mediaplayer/mmrenderermediaplayercontrol.cpp b/src/plugins/qnx/mediaplayer/mmrenderermediaplayercontrol.cpp index c66ac937d..fc48ed818 100644 --- a/src/plugins/qnx/mediaplayer/mmrenderermediaplayercontrol.cpp +++ b/src/plugins/qnx/mediaplayer/mmrenderermediaplayercontrol.cpp @@ -230,7 +230,7 @@ void MmRendererMediaPlayerControl::attach() } } - const QByteArray resourcePath = resourcePathForUrl(m_media.canonicalUrl()); + const QByteArray resourcePath = resourcePathForUrl(m_media.request().url()); if (resourcePath.isEmpty()) { detach(); return; diff --git a/src/plugins/windowsaudio/qwindowsaudioinput.cpp b/src/plugins/windowsaudio/qwindowsaudioinput.cpp index 717baaff0..3332e3067 100644 --- a/src/plugins/windowsaudio/qwindowsaudioinput.cpp +++ b/src/plugins/windowsaudio/qwindowsaudioinput.cpp @@ -52,6 +52,7 @@ #include "qwindowsaudioinput.h" #include <QtCore/QDataStream> +#include <QtCore/qtimer.h> QT_BEGIN_NAMESPACE diff --git a/src/plugins/windowsaudio/qwindowsaudioinput.h b/src/plugins/windowsaudio/qwindowsaudioinput.h index a0feae257..817176731 100644 --- a/src/plugins/windowsaudio/qwindowsaudioinput.h +++ b/src/plugins/windowsaudio/qwindowsaudioinput.h @@ -55,7 +55,7 @@ #include <QtCore/qfile.h> #include <QtCore/qdebug.h> -#include <QtCore/qtimer.h> +#include <QtCore/qelapsedtimer.h> #include <QtCore/qstring.h> #include <QtCore/qstringlist.h> #include <QtCore/qdatetime.h> @@ -120,9 +120,9 @@ private: QByteArray m_device; int bytesAvailable; int intervalTime; - QTime timeStamp; + QElapsedTimer timeStamp; qint64 elapsedTimeOffset; - QTime timeStampOpened; + QElapsedTimer timeStampOpened; qint64 totalTimeValue; bool pullMode; bool resuming; diff --git a/src/plugins/windowsaudio/qwindowsaudiooutput.cpp b/src/plugins/windowsaudio/qwindowsaudiooutput.cpp index f39e1694b..1182647fc 100644 --- a/src/plugins/windowsaudio/qwindowsaudiooutput.cpp +++ b/src/plugins/windowsaudio/qwindowsaudiooutput.cpp @@ -53,6 +53,7 @@ #include "qwindowsaudioutils.h" #include <QtEndian> #include <QtCore/QDataStream> +#include <QtCore/qtimer.h> #include <private/qaudiohelpers_p.h> //#define DEBUG_AUDIO 1 diff --git a/src/plugins/windowsaudio/qwindowsaudiooutput.h b/src/plugins/windowsaudio/qwindowsaudiooutput.h index 30ee1defe..d6e6998ec 100644 --- a/src/plugins/windowsaudio/qwindowsaudiooutput.h +++ b/src/plugins/windowsaudio/qwindowsaudiooutput.h @@ -54,7 +54,7 @@ #include "qwindowsaudioutils.h" #include <QtCore/qdebug.h> -#include <QtCore/qtimer.h> +#include <QtCore/qelapsedtimer.h> #include <QtCore/qstring.h> #include <QtCore/qstringlist.h> #include <QtCore/qdatetime.h> @@ -118,9 +118,9 @@ private: void pauseAndSleep(); QByteArray m_device; int bytesAvailable; - QTime timeStamp; + QElapsedTimer timeStamp; qint64 elapsedTimeOffset; - QTime timeStampOpened; + QElapsedTimer timeStampOpened; qint32 buffer_size; qint32 period_size; qint32 blocks_count; diff --git a/src/plugins/winrt/qwinrtmediaplayercontrol.cpp b/src/plugins/winrt/qwinrtmediaplayercontrol.cpp index 779703392..ee916b750 100644 --- a/src/plugins/winrt/qwinrtmediaplayercontrol.cpp +++ b/src/plugins/winrt/qwinrtmediaplayercontrol.cpp @@ -759,20 +759,15 @@ void QWinRTMediaPlayerControl::setMedia(const QMediaContent &media, QIODevice *s } emit mediaChanged(media); - QString urlString = media.canonicalUrl().toString(); + QString urlString = media.request().url().toString(); if (!d->stream) { // If we can read the file via Qt, use the byte stream approach - const auto resources = media.resources(); - for (const QMediaResource &resource : resources) { - const QUrl url = resource.url(); - if (url.isLocalFile()) { - urlString = url.toLocalFile(); - QScopedPointer<QFile> file(new QFile(urlString)); - if (file->open(QFile::ReadOnly)) { - file->setProperty(QT_WINRT_MEDIAPLAYER_STREAM_ID, true); - d->stream.reset(file.take()); - break; - } + if (media.request().url().isLocalFile()) { + urlString = media.request().url().toLocalFile(); + QScopedPointer<QFile> file(new QFile(urlString)); + if (file->open(QFile::ReadOnly)) { + file->setProperty(QT_WINRT_MEDIAPLAYER_STREAM_ID, true); + d->stream.reset(file.take()); } } } diff --git a/src/plugins/wmf/player/mfplayersession.cpp b/src/plugins/wmf/player/mfplayersession.cpp index 9f909252d..10ba25998 100644 --- a/src/plugins/wmf/player/mfplayersession.cpp +++ b/src/plugins/wmf/player/mfplayersession.cpp @@ -197,7 +197,7 @@ void MFPlayerSession::load(const QMediaContent &media, QIODevice *stream) qDebug() << "load"; #endif clear(); - QUrl url = media.canonicalUrl(); + QUrl url = media.request().url(); if (m_status == QMediaPlayer::LoadingMedia && m_sourceResolver) m_sourceResolver->cancel(); diff --git a/src/plugins/wmf/player/mftvideo.cpp b/src/plugins/wmf/player/mftvideo.cpp index 747fe6aea..879911d55 100644 --- a/src/plugins/wmf/player/mftvideo.cpp +++ b/src/plugins/wmf/player/mftvideo.cpp @@ -573,7 +573,7 @@ STDMETHODIMP MFTransform::ProcessOutput(DWORD dwFlags, DWORD cOutputBufferCount, if (!m_videoProbes.isEmpty()) { QVideoFrame frame = makeVideoFrame(); - foreach (MFVideoProbeControl* probe, m_videoProbes) + for (MFVideoProbeControl* probe : qAsConst(m_videoProbes)) probe->bufferProbed(frame); } m_videoProbeMutex.unlock(); diff --git a/src/multimedia/qtmultimediaquicktools_headers/qdeclarativevideooutput_backend_p.h b/src/qtmultimediaquicktools/qdeclarativevideooutput_backend_p.h index da99b387a..da99b387a 100644 --- a/src/multimedia/qtmultimediaquicktools_headers/qdeclarativevideooutput_backend_p.h +++ b/src/qtmultimediaquicktools/qdeclarativevideooutput_backend_p.h diff --git a/src/multimedia/qtmultimediaquicktools_headers/qdeclarativevideooutput_p.h b/src/qtmultimediaquicktools/qdeclarativevideooutput_p.h index 8ea0dc338..8ea0dc338 100644 --- a/src/multimedia/qtmultimediaquicktools_headers/qdeclarativevideooutput_p.h +++ b/src/qtmultimediaquicktools/qdeclarativevideooutput_p.h diff --git a/src/multimedia/qtmultimediaquicktools_headers/qsgvideonode_p.h b/src/qtmultimediaquicktools/qsgvideonode_p.h index c094bed1f..c094bed1f 100644 --- a/src/multimedia/qtmultimediaquicktools_headers/qsgvideonode_p.h +++ b/src/qtmultimediaquicktools/qsgvideonode_p.h diff --git a/src/qtmultimediaquicktools/qsgvideonode_texture.cpp b/src/qtmultimediaquicktools/qsgvideonode_texture.cpp index f5545afc7..473a4144f 100644 --- a/src/qtmultimediaquicktools/qsgvideonode_texture.cpp +++ b/src/qtmultimediaquicktools/qsgvideonode_texture.cpp @@ -44,6 +44,7 @@ #include <QtGui/QOpenGLFunctions> #include <QtGui/QOpenGLShaderProgram> #include <QtMultimedia/private/qmediaopenglhelper_p.h> +#include <QtMultimedia/private/qtmultimediaglobal_p.h> QT_BEGIN_NAMESPACE @@ -58,6 +59,9 @@ QList<QVideoFrame::PixelFormat> QSGVideoNodeFactory_Texture::supportedPixelForma pixelFormats.append(QVideoFrame::Format_ARGB32); pixelFormats.append(QVideoFrame::Format_BGR32); pixelFormats.append(QVideoFrame::Format_BGRA32); +#if !QT_CONFIG(gpu_vivante) + pixelFormats.append(QVideoFrame::Format_ABGR32); +#endif } return pixelFormats; diff --git a/src/qtmultimediaquicktools/qsgvideonode_yuv.cpp b/src/qtmultimediaquicktools/qsgvideonode_yuv.cpp index 8e4ea01a1..f07362bf1 100644 --- a/src/qtmultimediaquicktools/qsgvideonode_yuv.cpp +++ b/src/qtmultimediaquicktools/qsgvideonode_yuv.cpp @@ -74,7 +74,7 @@ QList<QVideoFrame::PixelFormat> QSGVideoNodeFactory_YUV::supportedPixelFormats( QList<QVideoFrame::PixelFormat> formats; if (handleType == QAbstractVideoBuffer::NoHandle) { - formats << QVideoFrame::Format_YUV420P << QVideoFrame::Format_YV12 + formats << QVideoFrame::Format_YUV420P << QVideoFrame::Format_YV12 << QVideoFrame::Format_YUV422P << QVideoFrame::Format_NV12 << QVideoFrame::Format_NV21 << QVideoFrame::Format_UYVY << QVideoFrame::Format_YUYV; } @@ -235,7 +235,7 @@ public: return &uyvyType; case QVideoFrame::Format_YUYV: return &yuyvType; - default: // Currently: YUV420P and YV12 + default: // Currently: YUV420P, YUV422P and YV12 return &triPlanarType; } } @@ -250,7 +250,7 @@ public: return new QSGVideoMaterialShader_UYVY; case QVideoFrame::Format_YUYV: return new QSGVideoMaterialShader_YUYV; - default: // Currently: YUV420P and YV12 + default: // Currently: YUV420P, YUV422P and YV12 return new QSGVideoMaterialShader_YUV_TriPlanar; } } @@ -308,6 +308,7 @@ QSGVideoMaterial_YUV::QSGVideoMaterial_YUV(const QVideoSurfaceFormat &format) : break; case QVideoFrame::Format_YUV420P: case QVideoFrame::Format_YV12: + case QVideoFrame::Format_YUV422P: m_planeCount = 3; break; case QVideoFrame::Format_UYVY: @@ -408,18 +409,20 @@ void QSGVideoMaterial_YUV::bind() functions->glActiveTexture(GL_TEXTURE0); // Finish with 0 as default texture unit bindTexture(m_textureIds[0], m_frame.bytesPerLine(y), fh, m_frame.bits(y), texFormat1); - } else { // YUV420P || YV12 + } else { // YUV420P || YV12 || YUV422P const int y = 0; - const int u = m_frame.pixelFormat() == QVideoFrame::Format_YUV420P ? 1 : 2; - const int v = m_frame.pixelFormat() == QVideoFrame::Format_YUV420P ? 2 : 1; + const int u = m_frame.pixelFormat() == QVideoFrame::Format_YV12 ? 2 : 1; + const int v = m_frame.pixelFormat() == QVideoFrame::Format_YV12 ? 1 : 2; m_planeWidth[0] = qreal(fw) / m_frame.bytesPerLine(y); m_planeWidth[1] = m_planeWidth[2] = qreal(fw) / (2 * m_frame.bytesPerLine(u)); + const int uvHeight = m_frame.pixelFormat() == QVideoFrame::Format_YUV422P ? fh : fh / 2; + functions->glActiveTexture(GL_TEXTURE1); - bindTexture(m_textureIds[1], m_frame.bytesPerLine(u), fh / 2, m_frame.bits(u), texFormat1); + bindTexture(m_textureIds[1], m_frame.bytesPerLine(u), uvHeight, m_frame.bits(u), texFormat1); functions->glActiveTexture(GL_TEXTURE2); - bindTexture(m_textureIds[2], m_frame.bytesPerLine(v), fh / 2, m_frame.bits(v), texFormat1); + bindTexture(m_textureIds[2], m_frame.bytesPerLine(v), uvHeight, m_frame.bits(v), texFormat1); functions->glActiveTexture(GL_TEXTURE0); // Finish with 0 as default texture unit bindTexture(m_textureIds[0], m_frame.bytesPerLine(y), fh, m_frame.bits(y), texFormat1); } diff --git a/src/multimedia/qtmultimediaquicktools_headers/qtmultimediaquickdefs_p.h b/src/qtmultimediaquicktools/qtmultimediaquickdefs_p.h index 20188739c..20188739c 100644 --- a/src/multimedia/qtmultimediaquicktools_headers/qtmultimediaquickdefs_p.h +++ b/src/qtmultimediaquicktools/qtmultimediaquickdefs_p.h diff --git a/src/qtmultimediaquicktools/qtmultimediaquicktools.pro b/src/qtmultimediaquicktools/qtmultimediaquicktools.pro index fd29ee5a4..cb1f8106b 100644 --- a/src/qtmultimediaquicktools/qtmultimediaquicktools.pro +++ b/src/qtmultimediaquicktools/qtmultimediaquicktools.pro @@ -3,11 +3,6 @@ TARGET = QtMultimediaQuick QT = core quick multimedia-private CONFIG += internal_module -# Header files must go inside source directory of a module -# to be installed by syncqt. -INCLUDEPATH += ../multimedia/qtmultimediaquicktools_headers/ -VPATH += ../multimedia/qtmultimediaquicktools_headers/ - PRIVATE_HEADERS += \ qdeclarativevideooutput_p.h \ qdeclarativevideooutput_backend_p.h \ diff --git a/tests/auto/integration/qaudiodeviceinfo/tst_qaudiodeviceinfo.cpp b/tests/auto/integration/qaudiodeviceinfo/tst_qaudiodeviceinfo.cpp index 9d44dc16f..c946c0894 100644 --- a/tests/auto/integration/qaudiodeviceinfo/tst_qaudiodeviceinfo.cpp +++ b/tests/auto/integration/qaudiodeviceinfo/tst_qaudiodeviceinfo.cpp @@ -226,7 +226,8 @@ void tst_QAudioDeviceInfo::equalityOperator() QVERIFY(!(dev1 != dev2)); // Make sure each available device is not equal to null - foreach (const QAudioDeviceInfo info, QAudioDeviceInfo::availableDevices(QAudio::AudioOutput)) { + const auto infos = QAudioDeviceInfo::availableDevices(QAudio::AudioOutput); + for (const QAudioDeviceInfo info : infos) { QVERIFY(dev1 != info); QVERIFY(!(dev1 == info)); diff --git a/tests/auto/integration/qaudioinput/BLACKLIST b/tests/auto/integration/qaudioinput/BLACKLIST index 994ea8f38..b7b86283b 100644 --- a/tests/auto/integration/qaudioinput/BLACKLIST +++ b/tests/auto/integration/qaudioinput/BLACKLIST @@ -5,5 +5,3 @@ linux linux [pullSuspendResume] linux -[push] -linux diff --git a/tests/auto/integration/qaudioinput/tst_qaudioinput.cpp b/tests/auto/integration/qaudioinput/tst_qaudioinput.cpp index 64e872f27..bcc50f78a 100644 --- a/tests/auto/integration/qaudioinput/tst_qaudioinput.cpp +++ b/tests/auto/integration/qaudioinput/tst_qaudioinput.cpp @@ -220,7 +220,7 @@ void tst_QAudioInput::initTestCase() QVERIFY(m_temporaryDir->isValid()); const QString temporaryAudioPath = m_temporaryDir->path() + slash; - foreach (const QAudioFormat &format, testFormats) { + for (const QAudioFormat &format : qAsConst(testFormats)) { const QString fileName = temporaryAudioPath + formatToFileName(format) + QStringLiteral(".wav"); audioFiles.append(FilePtr::create(fileName)); } diff --git a/tests/auto/integration/qaudiooutput/tst_qaudiooutput.cpp b/tests/auto/integration/qaudiooutput/tst_qaudiooutput.cpp index f167bf8ec..f3a676073 100644 --- a/tests/auto/integration/qaudiooutput/tst_qaudiooutput.cpp +++ b/tests/auto/integration/qaudiooutput/tst_qaudiooutput.cpp @@ -264,7 +264,7 @@ void tst_QAudioOutput::initTestCase() QVERIFY(m_temporaryDir->isValid()); const QString temporaryAudioPath = m_temporaryDir->path() + slash; - foreach (const QAudioFormat &format, testFormats) { + for (const QAudioFormat &format : qAsConst(testFormats)) { qint64 len = (format.sampleRate()*format.channelCount()*(format.sampleSize()/8)*2); // 2 seconds createSineWaveData(format, len); // Write generate sine wave data to file diff --git a/tests/auto/integration/qcamerabackend/tst_qcamerabackend.cpp b/tests/auto/integration/qcamerabackend/tst_qcamerabackend.cpp index 80e2e693c..894486230 100644 --- a/tests/auto/integration/qcamerabackend/tst_qcamerabackend.cpp +++ b/tests/auto/integration/qcamerabackend/tst_qcamerabackend.cpp @@ -69,8 +69,10 @@ public slots: void cleanupTestCase(); private slots: +#if QT_DEPRECATED_SINCE(5, 3) void testAvailableDevices(); void testDeviceDescription(); +#endif void testCameraInfo(); void testCtorWithDevice(); void testCtorWithCameraInfo(); @@ -101,6 +103,7 @@ void tst_QCameraBackend::cleanupTestCase() { } +#if QT_DEPRECATED_SINCE(5, 3) void tst_QCameraBackend::testAvailableDevices() { int deviceCount = QMediaServiceProvider::defaultServiceProvider()->devices(QByteArray(Q_MEDIASERVICE_CAMERA)).count(); @@ -114,22 +117,24 @@ void tst_QCameraBackend::testDeviceDescription() if (deviceCount == 0) QVERIFY(QCamera::deviceDescription(QByteArray("random")).isNull()); else { - foreach (const QByteArray &device, QCamera::availableDevices()) + const auto devices = QCamera::availableDevices(); + for (const QByteArray &device : devices) QVERIFY(QCamera::deviceDescription(device).length() > 0); } } +#endif void tst_QCameraBackend::testCameraInfo() { int deviceCount = QMediaServiceProvider::defaultServiceProvider()->devices(QByteArray(Q_MEDIASERVICE_CAMERA)).count(); - QList<QCameraInfo> cameras = QCameraInfo::availableCameras(); + const QList<QCameraInfo> cameras = QCameraInfo::availableCameras(); QCOMPARE(cameras.count(), deviceCount); if (cameras.isEmpty()) { QVERIFY(QCameraInfo::defaultCamera().isNull()); QSKIP("Camera selection is not supported"); } - foreach (const QCameraInfo &info, cameras) { + for (const QCameraInfo &info : cameras) { QVERIFY(!info.deviceName().isEmpty()); QVERIFY(!info.description().isEmpty()); QVERIFY(info.orientation() % 90 == 0); @@ -138,10 +143,11 @@ void tst_QCameraBackend::testCameraInfo() void tst_QCameraBackend::testCtorWithDevice() { - if (QCamera::availableDevices().isEmpty()) + const auto availableCameras = QCameraInfo::availableCameras(); + if (availableCameras.isEmpty()) QSKIP("Camera selection not supported"); - QCamera *camera = new QCamera(QCamera::availableDevices().first()); + QCamera *camera = new QCamera(availableCameras.first().deviceName().toLatin1()); QCOMPARE(camera->error(), QCamera::NoError); delete camera; @@ -607,11 +613,11 @@ void tst_QCameraBackend::testVideoRecording_data() { QTest::addColumn<QByteArray>("device"); - QList<QByteArray> devices = QCamera::availableDevices(); + const auto devices = QCameraInfo::availableCameras(); - foreach (const QByteArray &device, devices) { - QTest::newRow(QCamera::deviceDescription(device).toUtf8()) - << device; + for (const auto &device : devices) { + QTest::newRow(device.description().toUtf8()) + << device.deviceName().toLatin1(); } if (devices.isEmpty()) diff --git a/tests/auto/integration/qdeclarativevideooutput/qdeclarativevideooutput.pro b/tests/auto/integration/qdeclarativevideooutput/qdeclarativevideooutput.pro index 1f3a00b42..c4221232a 100644 --- a/tests/auto/integration/qdeclarativevideooutput/qdeclarativevideooutput.pro +++ b/tests/auto/integration/qdeclarativevideooutput/qdeclarativevideooutput.pro @@ -1,6 +1,6 @@ TARGET = tst_qdeclarativevideooutput -QT += multimedia-private qml testlib quick +QT += multimedia-private qml testlib quick qtmultimediaquicktools-private CONFIG += testcase RESOURCES += qml.qrc diff --git a/tests/auto/integration/qdeclarativevideooutput/tst_qdeclarativevideooutput.cpp b/tests/auto/integration/qdeclarativevideooutput/tst_qdeclarativevideooutput.cpp index 5b9fdd03c..798b63f96 100644 --- a/tests/auto/integration/qdeclarativevideooutput/tst_qdeclarativevideooutput.cpp +++ b/tests/auto/integration/qdeclarativevideooutput/tst_qdeclarativevideooutput.cpp @@ -280,11 +280,11 @@ void tst_QDeclarativeVideoOutput::surfaceSource() QVERIFY(holder.videoSurface() != 0); // Now we could do things with the surface.. - QList<QVideoFrame::PixelFormat> formats = holder.videoSurface()->supportedPixelFormats(); + const QList<QVideoFrame::PixelFormat> formats = holder.videoSurface()->supportedPixelFormats(); QVERIFY(formats.count() > 0); // See if we can start and stop each pixel format (..) - foreach (QVideoFrame::PixelFormat format, formats) { + for (QVideoFrame::PixelFormat format : formats) { QVideoSurfaceFormat surfaceFormat(QSize(200,100), format); QVERIFY(holder.videoSurface()->isFormatSupported(surfaceFormat)); // This does kind of depend on node factories diff --git a/tests/auto/integration/qdeclarativevideooutput_window/qdeclarativevideooutput_window.pro b/tests/auto/integration/qdeclarativevideooutput_window/qdeclarativevideooutput_window.pro index 82108d220..eeb1c0135 100644 --- a/tests/auto/integration/qdeclarativevideooutput_window/qdeclarativevideooutput_window.pro +++ b/tests/auto/integration/qdeclarativevideooutput_window/qdeclarativevideooutput_window.pro @@ -1,6 +1,6 @@ TARGET = tst_qdeclarativevideooutput_window -QT += multimedia-private qml testlib quick +QT += multimedia-private qml testlib quick qtmultimediaquicktools-private CONFIG += testcase RESOURCES += qml.qrc diff --git a/tests/auto/integration/qmediaplayerbackend/BLACKLIST b/tests/auto/integration/qmediaplayerbackend/BLACKLIST index c81f6c24f..c2833f1f7 100644 --- a/tests/auto/integration/qmediaplayerbackend/BLACKLIST +++ b/tests/auto/integration/qmediaplayerbackend/BLACKLIST @@ -1,8 +1,10 @@ # QTBUG-46368 osx -windows - +windows-7 +windows-7sp1 +windows-10 msvc-2015 +windows-10 msvc-2017 # Media player plugin not built at the moment on this platform opensuse-13.1 64bit diff --git a/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp b/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp index df218be7f..9cd3b7fa9 100644 --- a/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp +++ b/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp @@ -154,7 +154,7 @@ QMediaContent tst_QMediaPlayerBackend::selectVideoFile(const QStringList& mediaC QSignalSpy errorSpy(&player, SIGNAL(error(QMediaPlayer::Error))); - foreach (QString s, mediaCandidates) { + for (const QString &s : mediaCandidates) { QFileInfo videoFile(s); if (!videoFile.exists()) continue; @@ -1354,6 +1354,7 @@ void tst_QMediaPlayerBackend::surfaceTest_data() QList<QVideoFrame::PixelFormat> formatsYUV; formatsYUV << QVideoFrame::Format_YUV420P + << QVideoFrame::Format_YUV422P << QVideoFrame::Format_YV12 << QVideoFrame::Format_UYVY << QVideoFrame::Format_YUYV diff --git a/tests/auto/integration/shared/mediafileselector.h b/tests/auto/integration/shared/mediafileselector.h index 8b88d14a4..984da6e2b 100644 --- a/tests/auto/integration/shared/mediafileselector.h +++ b/tests/auto/integration/shared/mediafileselector.h @@ -42,7 +42,7 @@ static QMediaContent selectMediaFile(const QStringList& mediaCandidates) QSignalSpy errorSpy(&player, SIGNAL(error(QMediaPlayer::Error))); - foreach (QString s, mediaCandidates) { + for (const QString &s : mediaCandidates) { QFileInfo mediaFile(s); if (!mediaFile.exists()) continue; diff --git a/tests/auto/unit/qcamera/tst_qcamera.cpp b/tests/auto/unit/qcamera/tst_qcamera.cpp index fa5e7187b..4b6202173 100644 --- a/tests/auto/unit/qcamera/tst_qcamera.cpp +++ b/tests/auto/unit/qcamera/tst_qcamera.cpp @@ -794,16 +794,16 @@ void tst_QCamera::testImageSettings() QVERIFY(!settings.isNull()); settings = QImageEncoderSettings(); - settings.setEncodingOption(QLatin1Literal("encoderOption"), QVariant(1)); - QCOMPARE(settings.encodingOption(QLatin1Literal("encoderOption")), QVariant(1)); + settings.setEncodingOption(QLatin1String("encoderOption"), QVariant(1)); + QCOMPARE(settings.encodingOption(QLatin1String("encoderOption")), QVariant(1)); QVariantMap options; - options.insert(QLatin1Literal("encoderOption"), QVariant(1)); + options.insert(QLatin1String("encoderOption"), QVariant(1)); QCOMPARE(settings.encodingOptions(), options); - options.insert(QLatin1Literal("encoderOption2"), QVariant(2)); - options.remove(QLatin1Literal("encoderOption")); + options.insert(QLatin1String("encoderOption2"), QVariant(2)); + options.remove(QLatin1String("encoderOption")); settings.setEncodingOptions(options); - QCOMPARE(settings.encodingOption(QLatin1Literal("encoderOption")), QVariant()); - QCOMPARE(settings.encodingOption(QLatin1Literal("encoderOption2")), QVariant(2)); + QCOMPARE(settings.encodingOption(QLatin1String("encoderOption")), QVariant()); + QCOMPARE(settings.encodingOption(QLatin1String("encoderOption2")), QVariant(2)); QVERIFY(!settings.isNull()); QVERIFY(settings != QImageEncoderSettings()); @@ -874,11 +874,11 @@ void tst_QCamera::testImageSettings() QVERIFY(settings1 != settings2); settings1 = QImageEncoderSettings(); - settings1.setEncodingOption(QLatin1Literal("encoderOption"), QVariant(1)); + settings1.setEncodingOption(QLatin1String("encoderOption"), QVariant(1)); settings2 = QImageEncoderSettings(); - settings2.setEncodingOption(QLatin1Literal("encoderOption"), QVariant(1)); + settings2.setEncodingOption(QLatin1String("encoderOption"), QVariant(1)); QVERIFY(settings1 == settings2); - settings2.setEncodingOption(QLatin1Literal("encoderOption"), QVariant(2)); + settings2.setEncodingOption(QLatin1String("encoderOption"), QVariant(2)); QVERIFY(settings1 != settings2); } diff --git a/tests/auto/unit/qdeclarativeaudio/tst_qdeclarativeaudio.cpp b/tests/auto/unit/qdeclarativeaudio/tst_qdeclarativeaudio.cpp index b270e93eb..87c72521c 100644 --- a/tests/auto/unit/qdeclarativeaudio/tst_qdeclarativeaudio.cpp +++ b/tests/auto/unit/qdeclarativeaudio/tst_qdeclarativeaudio.cpp @@ -411,17 +411,17 @@ void tst_QDeclarativeAudio::source() audio.setSource(url1); QCOMPARE(audio.source(), url1); - QCOMPARE(provider.playerControl()->media().canonicalUrl(), url1); + QCOMPARE(provider.playerControl()->media().request().url(), url1); QCOMPARE(spy.count(), 1); audio.setSource(url2); QCOMPARE(audio.source(), url2); - QCOMPARE(provider.playerControl()->media().canonicalUrl(), url2); + QCOMPARE(provider.playerControl()->media().request().url(), url2); QCOMPARE(spy.count(), 2); audio.setSource(url3); QCOMPARE(audio.source(), url3); - QCOMPARE(provider.playerControl()->media().canonicalUrl(), url3); + QCOMPARE(provider.playerControl()->media().request().url(), url3); QCOMPARE(spy.count(), 3); } diff --git a/tests/auto/unit/qmediacontent/tst_qmediacontent.cpp b/tests/auto/unit/qmediacontent/tst_qmediacontent.cpp index d10257c19..3c68a32b1 100644 --- a/tests/auto/unit/qmediacontent/tst_qmediacontent.cpp +++ b/tests/auto/unit/qmediacontent/tst_qmediacontent.cpp @@ -43,12 +43,16 @@ private slots: void testNull(); void testUrlCtor(); void testRequestCtor(); +#if QT_DEPRECATED_SINCE(6, 0) void testResourceCtor(); void testResourceListCtor(); +#endif void testCopy(); void testAssignment(); void testEquality(); +#if QT_DEPRECATED_SINCE(6, 0) void testResources(); +#endif void testPlaylist(); }; @@ -57,17 +61,23 @@ void tst_QMediaContent::testNull() QMediaContent media; QCOMPARE(media.isNull(), true); + QCOMPARE(media.request().url(), QUrl()); +#if QT_DEPRECATED_SINCE(6, 0) QCOMPARE(media.canonicalUrl(), QUrl()); QCOMPARE(media.canonicalResource(), QMediaResource()); QCOMPARE(media.resources(), QMediaResourceList()); +#endif } void tst_QMediaContent::testUrlCtor() { QMediaContent media(QUrl("http://example.com/movie.mov")); + QCOMPARE(media.request().url(), QUrl("http://example.com/movie.mov")); +#if QT_DEPRECATED_SINCE(6, 0) QCOMPARE(media.canonicalUrl(), QUrl("http://example.com/movie.mov")); QCOMPARE(media.canonicalResource().url(), QUrl("http://example.com/movie.mov")); +#endif } void tst_QMediaContent::testRequestCtor() @@ -76,13 +86,18 @@ void tst_QMediaContent::testRequestCtor() request.setAttribute(QNetworkRequest::User, QVariant(1234)); QMediaContent media(request); + QCOMPARE(media.request().url(), QUrl("http://example.com/movie.mov")); + QCOMPARE(media.request(), request); +#if QT_DEPRECATED_SINCE(6, 0) QCOMPARE(media.canonicalUrl(), QUrl("http://example.com/movie.mov")); QCOMPARE(media.canonicalRequest(),request); QCOMPARE(media.canonicalResource().request(), request); QCOMPARE(media.canonicalResource().url(), QUrl("http://example.com/movie.mov")); +#endif } +#if QT_DEPRECATED_SINCE(6, 0) void tst_QMediaContent::testResourceCtor() { QMediaContent media(QMediaResource(QUrl("http://example.com/movie.mov"))); @@ -100,10 +115,11 @@ void tst_QMediaContent::testResourceListCtor() QCOMPARE(media.canonicalUrl(), QUrl("http://example.com/movie.mov")); QCOMPARE(media.canonicalResource().url(), QUrl("http://example.com/movie.mov")); } +#endif void tst_QMediaContent::testCopy() { - QMediaContent media1(QMediaResource(QUrl("http://example.com/movie.mov"))); + QMediaContent media1(QUrl("http://example.com/movie.mov")); QMediaContent media2(media1); QVERIFY(media1 == media2); @@ -111,7 +127,7 @@ void tst_QMediaContent::testCopy() void tst_QMediaContent::testAssignment() { - QMediaContent media1(QMediaResource(QUrl("http://example.com/movie.mov"))); + QMediaContent media1(QUrl("http://example.com/movie.mov")); QMediaContent media2; QMediaContent media3; @@ -126,9 +142,9 @@ void tst_QMediaContent::testEquality() { QMediaContent media1; QMediaContent media2; - QMediaContent media3(QMediaResource(QUrl("http://example.com/movie.mov"))); - QMediaContent media4(QMediaResource(QUrl("http://example.com/movie.mov"))); - QMediaContent media5(QMediaResource(QUrl("file:///some/where/over/the/rainbow.mp3"))); + QMediaContent media3(QUrl("http://example.com/movie.mov")); + QMediaContent media4(QUrl("http://example.com/movie.mov")); + QMediaContent media5(QUrl("file:///some/where/over/the/rainbow.mp3")); // null == null QCOMPARE(media1 == media2, true); @@ -147,6 +163,7 @@ void tst_QMediaContent::testEquality() QCOMPARE(media4 != media5, true); } +#if QT_DEPRECATED_SINCE(6, 0) void tst_QMediaContent::testResources() { QMediaResourceList resourceList; @@ -160,17 +177,18 @@ void tst_QMediaContent::testResources() QCOMPARE(res[0], QMediaResource(QUrl("http://example.com/movie-main.mov"))); QCOMPARE(res[1], QMediaResource(QUrl("http://example.com/movie-big.mov"))); } +#endif void tst_QMediaContent::testPlaylist() { QMediaContent media(QUrl("http://example.com/movie.mov")); - QVERIFY(media.canonicalUrl().isValid()); + QVERIFY(media.request().url().isValid()); QVERIFY(!media.playlist()); { QPointer<QMediaPlaylist> playlist(new QMediaPlaylist); media = QMediaContent(playlist.data(), QUrl("http://example.com/sample.m3u"), true); - QVERIFY(media.canonicalUrl().isValid()); + QVERIFY(media.request().url().isValid()); QCOMPARE(media.playlist(), playlist.data()); media = QMediaContent(); // Make sure playlist is destroyed by QMediaContent @@ -189,7 +207,7 @@ void tst_QMediaContent::testPlaylist() { QPointer<QMediaPlaylist> playlist(new QMediaPlaylist); media = QMediaContent(playlist.data(), QUrl(), false); - QVERIFY(!media.canonicalUrl().isValid()); + QVERIFY(!media.request().url().isValid()); QCOMPARE(media.playlist(), playlist.data()); media = QMediaContent(); QVERIFY(playlist); diff --git a/tests/auto/unit/qmediaplayer/tst_qmediaplayer.cpp b/tests/auto/unit/qmediaplayer/tst_qmediaplayer.cpp index 94d297ad0..f2b993722 100644 --- a/tests/auto/unit/qmediaplayer/tst_qmediaplayer.cpp +++ b/tests/auto/unit/qmediaplayer/tst_qmediaplayer.cpp @@ -1293,7 +1293,7 @@ void tst_QMediaPlayer::testQrc() } // Check the media actually passed to the backend - QCOMPARE(mockService->mockControl->media().canonicalUrl().scheme(), backendMediaContentScheme); + QCOMPARE(mockService->mockControl->media().request().url().scheme(), backendMediaContentScheme); QCOMPARE(bool(mockService->mockControl->mediaStream()), backendHasStream); } @@ -1329,7 +1329,7 @@ void tst_QMediaPlayer::testAudioRole() spy.clear(); - player.setProperty("audioRole", qVariantFromValue(QAudio::AlarmRole)); + player.setProperty("audioRole", QVariant::fromValue(QAudio::AlarmRole)); QCOMPARE(qvariant_cast<QAudio::Role>(player.property("audioRole")), QAudio::AlarmRole); QCOMPARE(mockService->mockAudioRoleControl->audioRole(), QAudio::AlarmRole); QCOMPARE(spy.count(), 1); @@ -1397,7 +1397,7 @@ void tst_QMediaPlayer::testCustomAudioRole() spyCustomRole.clear(); QString customRole2(QStringLiteral("customRole2")); - player.setProperty("customAudioRole", qVariantFromValue(customRole2)); + player.setProperty("customAudioRole", QVariant::fromValue(customRole2)); QCOMPARE(qvariant_cast<QString>(player.property("customAudioRole")), customRole2); QCOMPARE(mockService->mockCustomAudioRoleControl->customAudioRole(), customRole2); QCOMPARE(spyRole.count(), 0); diff --git a/tests/auto/unit/qmediaplaylist/tst_qmediaplaylist.cpp b/tests/auto/unit/qmediaplaylist/tst_qmediaplaylist.cpp index 3a59823ca..9b1385dac 100644 --- a/tests/auto/unit/qmediaplaylist/tst_qmediaplaylist.cpp +++ b/tests/auto/unit/qmediaplaylist/tst_qmediaplaylist.cpp @@ -542,19 +542,19 @@ void tst_QMediaPlaylist::loadM3uFile() QCOMPARE(playlist.error(), QMediaPlaylist::NoError); QCOMPARE(playlist.mediaCount(), 7); - QCOMPARE(playlist.media(0).canonicalUrl(), QUrl(QLatin1String("http://test.host/path"))); - QCOMPARE(playlist.media(1).canonicalUrl(), QUrl(QLatin1String("http://test.host/path"))); + QCOMPARE(playlist.media(0).request().url(), QUrl(QLatin1String("http://test.host/path"))); + QCOMPARE(playlist.media(1).request().url(), QUrl(QLatin1String("http://test.host/path"))); testFileName = QFINDTESTDATA("testdata/testfile"); - QCOMPARE(playlist.media(2).canonicalUrl(), + QCOMPARE(playlist.media(2).request().url(), QUrl::fromLocalFile(testFileName)); testFileName = QFINDTESTDATA("testdata"); - QCOMPARE(playlist.media(3).canonicalUrl(), + QCOMPARE(playlist.media(3).request().url(), QUrl::fromLocalFile(testFileName + "/testdir/testfile")); - QCOMPARE(playlist.media(4).canonicalUrl(), QUrl(QLatin1String("file:///testdir/testfile"))); - QCOMPARE(playlist.media(5).canonicalUrl(), QUrl(QLatin1String("file://path/name#suffix"))); + QCOMPARE(playlist.media(4).request().url(), QUrl(QLatin1String("file:///testdir/testfile"))); + QCOMPARE(playlist.media(5).request().url(), QUrl(QLatin1String("file://path/name#suffix"))); //ensure #2 suffix is not stripped from path testFileName = QFINDTESTDATA("testdata/testfile2#suffix"); - QCOMPARE(playlist.media(6).canonicalUrl(), QUrl::fromLocalFile(testFileName)); + QCOMPARE(playlist.media(6).request().url(), QUrl::fromLocalFile(testFileName)); // check ability to load from QNetworkRequest loadSpy.clear(); @@ -597,19 +597,19 @@ void tst_QMediaPlaylist::loadPLSFile() QCOMPARE(playlist.error(), QMediaPlaylist::NoError); QCOMPARE(playlist.mediaCount(), 7); - QCOMPARE(playlist.media(0).canonicalUrl(), QUrl(QLatin1String("http://test.host/path"))); - QCOMPARE(playlist.media(1).canonicalUrl(), QUrl(QLatin1String("http://test.host/path"))); + QCOMPARE(playlist.media(0).request().url(), QUrl(QLatin1String("http://test.host/path"))); + QCOMPARE(playlist.media(1).request().url(), QUrl(QLatin1String("http://test.host/path"))); testFileName = QFINDTESTDATA("testdata/testfile"); - QCOMPARE(playlist.media(2).canonicalUrl(), + QCOMPARE(playlist.media(2).request().url(), QUrl::fromLocalFile(testFileName)); testFileName = QFINDTESTDATA("testdata"); - QCOMPARE(playlist.media(3).canonicalUrl(), + QCOMPARE(playlist.media(3).request().url(), QUrl::fromLocalFile(testFileName + "/testdir/testfile")); - QCOMPARE(playlist.media(4).canonicalUrl(), QUrl(QLatin1String("file:///testdir/testfile"))); - QCOMPARE(playlist.media(5).canonicalUrl(), QUrl(QLatin1String("file://path/name#suffix"))); + QCOMPARE(playlist.media(4).request().url(), QUrl(QLatin1String("file:///testdir/testfile"))); + QCOMPARE(playlist.media(5).request().url(), QUrl(QLatin1String("file://path/name#suffix"))); //ensure #2 suffix is not stripped from path testFileName = QFINDTESTDATA("testdata/testfile2#suffix"); - QCOMPARE(playlist.media(6).canonicalUrl(), QUrl::fromLocalFile(testFileName)); + QCOMPARE(playlist.media(6).request().url(), QUrl::fromLocalFile(testFileName)); // Try to load a totem-pl generated playlist // (Format doesn't respect the spec) @@ -622,7 +622,7 @@ void tst_QMediaPlaylist::loadPLSFile() QVERIFY(loadFailedSpy.isEmpty()); QCOMPARE(playlist.error(), QMediaPlaylist::NoError); QCOMPARE(playlist.mediaCount(), 1); - QCOMPARE(playlist.media(0).canonicalUrl(), QUrl(QLatin1String("http://test.host/path"))); + QCOMPARE(playlist.media(0).request().url(), QUrl(QLatin1String("http://test.host/path"))); // check ability to load from QNetworkRequest diff --git a/tests/auto/unit/qmediapluginloader/tst_qmediapluginloader.cpp b/tests/auto/unit/qmediapluginloader/tst_qmediapluginloader.cpp index 3a7b661df..ce1b2b9d0 100644 --- a/tests/auto/unit/qmediapluginloader/tst_qmediapluginloader.cpp +++ b/tests/auto/unit/qmediapluginloader/tst_qmediapluginloader.cpp @@ -72,7 +72,7 @@ void tst_QMediaPluginLoader::testInstance() if (keys.isEmpty()) // Test is invalidated, skip. QSKIP("No plug-ins available"); - foreach (const QString &key, keys) + for (const QString &key : keys) QVERIFY(loader->instance(key) != 0); } @@ -83,7 +83,7 @@ void tst_QMediaPluginLoader::testInstances() if (keys.isEmpty()) // Test is invalidated, skip. QSKIP("No plug-ins available"); - foreach (const QString &key, keys) + for (const QString &key : keys) QVERIFY(loader->instances(key).size() > 0); } diff --git a/tests/auto/unit/qmediarecorder/tst_qmediarecorder.cpp b/tests/auto/unit/qmediarecorder/tst_qmediarecorder.cpp index 2bcf2011d..944207dfe 100644 --- a/tests/auto/unit/qmediarecorder/tst_qmediarecorder.cpp +++ b/tests/auto/unit/qmediarecorder/tst_qmediarecorder.cpp @@ -512,16 +512,16 @@ void tst_QMediaRecorder::testAudioSettings() QVERIFY(!settings.isNull()); settings = QAudioEncoderSettings(); - settings.setEncodingOption(QLatin1Literal("encoderOption"), QVariant(1)); - QCOMPARE(settings.encodingOption(QLatin1Literal("encoderOption")), QVariant(1)); + settings.setEncodingOption(QLatin1String("encoderOption"), QVariant(1)); + QCOMPARE(settings.encodingOption(QLatin1String("encoderOption")), QVariant(1)); QVariantMap options; - options.insert(QLatin1Literal("encoderOption"), QVariant(1)); + options.insert(QLatin1String("encoderOption"), QVariant(1)); QCOMPARE(settings.encodingOptions(), options); - options.insert(QLatin1Literal("encoderOption2"), QVariant(2)); - options.remove(QLatin1Literal("encoderOption")); + options.insert(QLatin1String("encoderOption2"), QVariant(2)); + options.remove(QLatin1String("encoderOption")); settings.setEncodingOptions(options); - QCOMPARE(settings.encodingOption(QLatin1Literal("encoderOption")), QVariant()); - QCOMPARE(settings.encodingOption(QLatin1Literal("encoderOption2")), QVariant(2)); + QCOMPARE(settings.encodingOption(QLatin1String("encoderOption")), QVariant()); + QCOMPARE(settings.encodingOption(QLatin1String("encoderOption2")), QVariant(2)); QVERIFY(!settings.isNull()); QVERIFY(settings != QAudioEncoderSettings()); @@ -614,11 +614,11 @@ void tst_QMediaRecorder::testAudioSettings() QVERIFY(settings1 != settings2); settings1 = QAudioEncoderSettings(); - settings1.setEncodingOption(QLatin1Literal("encoderOption"), QVariant(1)); + settings1.setEncodingOption(QLatin1String("encoderOption"), QVariant(1)); settings2 = QAudioEncoderSettings(); - settings2.setEncodingOption(QLatin1Literal("encoderOption"), QVariant(1)); + settings2.setEncodingOption(QLatin1String("encoderOption"), QVariant(1)); QVERIFY(settings1 == settings2); - settings2.setEncodingOption(QLatin1Literal("encoderOption"), QVariant(2)); + settings2.setEncodingOption(QLatin1String("encoderOption"), QVariant(2)); QVERIFY(settings1 != settings2); } @@ -663,16 +663,16 @@ void tst_QMediaRecorder::testVideoSettings() QVERIFY(!settings.isNull()); settings = QVideoEncoderSettings(); - settings.setEncodingOption(QLatin1Literal("encoderOption"), QVariant(1)); - QCOMPARE(settings.encodingOption(QLatin1Literal("encoderOption")), QVariant(1)); + settings.setEncodingOption(QLatin1String("encoderOption"), QVariant(1)); + QCOMPARE(settings.encodingOption(QLatin1String("encoderOption")), QVariant(1)); QVariantMap options; - options.insert(QLatin1Literal("encoderOption"), QVariant(1)); + options.insert(QLatin1String("encoderOption"), QVariant(1)); QCOMPARE(settings.encodingOptions(), options); - options.insert(QLatin1Literal("encoderOption2"), QVariant(2)); - options.remove(QLatin1Literal("encoderOption")); + options.insert(QLatin1String("encoderOption2"), QVariant(2)); + options.remove(QLatin1String("encoderOption")); settings.setEncodingOptions(options); - QCOMPARE(settings.encodingOption(QLatin1Literal("encoderOption")), QVariant()); - QCOMPARE(settings.encodingOption(QLatin1Literal("encoderOption2")), QVariant(2)); + QCOMPARE(settings.encodingOption(QLatin1String("encoderOption")), QVariant()); + QCOMPARE(settings.encodingOption(QLatin1String("encoderOption2")), QVariant(2)); QVERIFY(!settings.isNull()); QVERIFY(settings != QVideoEncoderSettings()); @@ -766,11 +766,11 @@ void tst_QMediaRecorder::testVideoSettings() QVERIFY(settings1 != settings2); settings1 = QVideoEncoderSettings(); - settings1.setEncodingOption(QLatin1Literal("encoderOption"), QVariant(1)); + settings1.setEncodingOption(QLatin1String("encoderOption"), QVariant(1)); settings2 = QVideoEncoderSettings(); - settings2.setEncodingOption(QLatin1Literal("encoderOption"), QVariant(1)); + settings2.setEncodingOption(QLatin1String("encoderOption"), QVariant(1)); QVERIFY(settings1 == settings2); - settings2.setEncodingOption(QLatin1Literal("encoderOption"), QVariant(2)); + settings2.setEncodingOption(QLatin1String("encoderOption"), QVariant(2)); QVERIFY(settings1 != settings2); } diff --git a/tests/auto/unit/qmediaresource/tst_qmediaresource.cpp b/tests/auto/unit/qmediaresource/tst_qmediaresource.cpp index cfb6b44e9..786570bec 100644 --- a/tests/auto/unit/qmediaresource/tst_qmediaresource.cpp +++ b/tests/auto/unit/qmediaresource/tst_qmediaresource.cpp @@ -37,6 +37,7 @@ class tst_QMediaResource : public QObject { Q_OBJECT private slots: +#if QT_DEPRECATED_SINCE(6, 0) void constructNull(); void construct_data(); void construct(); @@ -47,8 +48,15 @@ private slots: void constructorRequest(); void copyConstructor(); +#else + void initTestCase() + { + QSKIP("Skipping this test, QMediaResource is deprecated."); + } +#endif }; +#if QT_DEPRECATED_SINCE(6, 0) void tst_QMediaResource::constructNull() { QMediaResource resource; @@ -682,6 +690,8 @@ void tst_QMediaResource::copyConstructor() QCOMPARE(original1 == copy1, true); } +#endif // QT_DEPRECATED_SINCE(6, 0) + QTEST_MAIN(tst_QMediaResource) #include "tst_qmediaresource.moc" diff --git a/tests/auto/unit/qmediaserviceprovider/mockserviceplugin1/mockserviceplugin1.pro b/tests/auto/unit/qmediaserviceprovider/mockserviceplugin1/mockserviceplugin1.pro index 7fcaadbc2..813d102cb 100644 --- a/tests/auto/unit/qmediaserviceprovider/mockserviceplugin1/mockserviceplugin1.pro +++ b/tests/auto/unit/qmediaserviceprovider/mockserviceplugin1/mockserviceplugin1.pro @@ -11,7 +11,7 @@ PLUGIN_CLASS_NAME = MockServicePlugin1 load(qt_plugin) DESTDIR = ../$${PLUGIN_TYPE} -win32 { +win32:debug_and_release { CONFIG(debug, debug|release) { DESTDIR = ../debug/$${PLUGIN_TYPE} } else { diff --git a/tests/auto/unit/qmediaserviceprovider/mockserviceplugin2/mockserviceplugin2.pro b/tests/auto/unit/qmediaserviceprovider/mockserviceplugin2/mockserviceplugin2.pro index 4ac001ec9..f2ac3291d 100644 --- a/tests/auto/unit/qmediaserviceprovider/mockserviceplugin2/mockserviceplugin2.pro +++ b/tests/auto/unit/qmediaserviceprovider/mockserviceplugin2/mockserviceplugin2.pro @@ -11,7 +11,7 @@ PLUGIN_CLASS_NAME = MockServicePlugin2 load(qt_plugin) DESTDIR = ../$${PLUGIN_TYPE} -win32 { +win32:debug_and_release { CONFIG(debug, debug|release) { DESTDIR = ../debug/$${PLUGIN_TYPE} } else { diff --git a/tests/auto/unit/qmediaserviceprovider/mockserviceplugin3/mockserviceplugin3.pro b/tests/auto/unit/qmediaserviceprovider/mockserviceplugin3/mockserviceplugin3.pro index 34cd2fed1..51f87d9da 100644 --- a/tests/auto/unit/qmediaserviceprovider/mockserviceplugin3/mockserviceplugin3.pro +++ b/tests/auto/unit/qmediaserviceprovider/mockserviceplugin3/mockserviceplugin3.pro @@ -11,7 +11,7 @@ PLUGIN_CLASS_NAME = MockServicePlugin3 load(qt_plugin) DESTDIR = ../$${PLUGIN_TYPE} -win32 { +win32:debug_and_release { CONFIG(debug, debug|release) { DESTDIR = ../debug/$${PLUGIN_TYPE} } else { diff --git a/tests/auto/unit/qmediaserviceprovider/mockserviceplugin4/mockserviceplugin4.pro b/tests/auto/unit/qmediaserviceprovider/mockserviceplugin4/mockserviceplugin4.pro index 0900bfc40..c3834ab03 100644 --- a/tests/auto/unit/qmediaserviceprovider/mockserviceplugin4/mockserviceplugin4.pro +++ b/tests/auto/unit/qmediaserviceprovider/mockserviceplugin4/mockserviceplugin4.pro @@ -11,7 +11,7 @@ PLUGIN_CLASS_NAME = MockServicePlugin4 load(qt_plugin) DESTDIR = ../$${PLUGIN_TYPE} -win32 { +win32:debug_and_release { CONFIG(debug, debug|release) { DESTDIR = ../debug/$${PLUGIN_TYPE} } else { diff --git a/tests/auto/unit/qmediaserviceprovider/mockserviceplugin5/mockserviceplugin5.pro b/tests/auto/unit/qmediaserviceprovider/mockserviceplugin5/mockserviceplugin5.pro index 37f287f9d..b273c6b15 100644 --- a/tests/auto/unit/qmediaserviceprovider/mockserviceplugin5/mockserviceplugin5.pro +++ b/tests/auto/unit/qmediaserviceprovider/mockserviceplugin5/mockserviceplugin5.pro @@ -11,7 +11,7 @@ PLUGIN_CLASS_NAME = MockServicePlugin5 load(qt_plugin) DESTDIR = ../$${PLUGIN_TYPE} -win32 { +win32:debug_and_release { CONFIG(debug, debug|release) { DESTDIR = ../debug/$${PLUGIN_TYPE} } else { diff --git a/tests/auto/unit/qmediaserviceprovider/test/test.pro b/tests/auto/unit/qmediaserviceprovider/test/test.pro index 2cf78c100..94f7f259a 100644 --- a/tests/auto/unit/qmediaserviceprovider/test/test.pro +++ b/tests/auto/unit/qmediaserviceprovider/test/test.pro @@ -5,7 +5,7 @@ QT += multimedia-private testlib SOURCES += ../tst_qmediaserviceprovider.cpp -win32 { +win32:debug_and_release { CONFIG(debug, debug|release) { TARGET = ../../debug/tst_qmediaserviceprovider } else { diff --git a/tests/auto/unit/qmultimedia_common/mockcameraexposurecontrol.h b/tests/auto/unit/qmultimedia_common/mockcameraexposurecontrol.h index 017615aa9..1b2372cf5 100644 --- a/tests/auto/unit/qmultimedia_common/mockcameraexposurecontrol.h +++ b/tests/auto/unit/qmultimedia_common/mockcameraexposurecontrol.h @@ -51,13 +51,22 @@ public: m_shutterRanges << 0.001 << 0.01 << 0.1 << 1.0; m_exposureRanges << -2.0 << 2.0; - QList<QCameraExposure::ExposureMode> exposureModes; - exposureModes << QCameraExposure::ExposureAuto << QCameraExposure::ExposureManual << QCameraExposure::ExposureBacklight - << QCameraExposure::ExposureNight << QCameraExposure::ExposureSpotlight << QCameraExposure::ExposureSports - << QCameraExposure::ExposureSnow << QCameraExposure:: ExposureLargeAperture << QCameraExposure::ExposureSmallAperture - << QCameraExposure::ExposurePortrait << QCameraExposure::ExposureModeVendor << QCameraExposure::ExposureBeach; + const QCameraExposure::ExposureMode exposureModes[] = { + QCameraExposure::ExposureAuto, + QCameraExposure::ExposureManual, + QCameraExposure::ExposureBacklight, + QCameraExposure::ExposureNight, + QCameraExposure::ExposureSpotlight, + QCameraExposure::ExposureSports, + QCameraExposure::ExposureSnow, + QCameraExposure:: ExposureLargeAperture, + QCameraExposure::ExposureSmallAperture, + QCameraExposure::ExposurePortrait, + QCameraExposure::ExposureModeVendor, + QCameraExposure::ExposureBeach, + }; - foreach (QCameraExposure::ExposureMode mode, exposureModes) + for (QCameraExposure::ExposureMode mode : exposureModes) m_exposureModes << QVariant::fromValue<QCameraExposure::ExposureMode>(mode); m_meteringModes << QVariant::fromValue<QCameraExposure::MeteringMode>(QCameraExposure::MeteringMatrix) diff --git a/tests/auto/unit/qmultimedia_common/mockmediaplaylistcontrol.h b/tests/auto/unit/qmultimedia_common/mockmediaplaylistcontrol.h index 229f70ea8..cc56e9adb 100644 --- a/tests/auto/unit/qmultimedia_common/mockmediaplaylistcontrol.h +++ b/tests/auto/unit/qmultimedia_common/mockmediaplaylistcontrol.h @@ -82,7 +82,8 @@ public: bool bMediaContentChanged = false; int i = 0; for (; i < playlistProvider()->mediaCount(); i++) { - if (playlistProvider()->media(i).canonicalUrl().toString() != newProvider->media(i).canonicalUrl().toString()) { + if (playlistProvider()->media(i).request().url().toString() + != newProvider->media(i).request().url().toString()) { bMediaContentChanged = true; break; } diff --git a/tests/auto/unit/qpaintervideosurface/tst_qpaintervideosurface.cpp b/tests/auto/unit/qpaintervideosurface/tst_qpaintervideosurface.cpp index 43dc52022..7ba631e58 100644 --- a/tests/auto/unit/qpaintervideosurface/tst_qpaintervideosurface.cpp +++ b/tests/auto/unit/qpaintervideosurface/tst_qpaintervideosurface.cpp @@ -730,16 +730,14 @@ void tst_QPainterVideoSurface::shaderSupportedFormat_data() QTest::addColumn<bool>("supportedPixelFormat"); QTest::addColumn<bool>("supportedFormat"); - QList<QPair<QPainterVideoSurface::ShaderType, QByteArray> > types; - - + const QPair<QPainterVideoSurface::ShaderType, QByteArray> types[] = { #if !defined(QT_OPENGL_ES) - types << qMakePair(QPainterVideoSurface::FragmentProgramShader, QByteArray("ARBfp: ")); + qMakePair(QPainterVideoSurface::FragmentProgramShader, QByteArray("ARBfp: ")), #endif - types << qMakePair(QPainterVideoSurface::GlslShader, QByteArray("GLSL: ")); + qMakePair(QPainterVideoSurface::GlslShader, QByteArray("GLSL: ")), + }; - QPair<QPainterVideoSurface::ShaderType, QByteArray> type; - foreach (type, types) { + for (const auto &type : types) { QTest::newRow((type.second + "rgb32 640x480").constData()) << type.first << QAbstractVideoBuffer::NoHandle @@ -952,14 +950,14 @@ void tst_QPainterVideoSurface::shaderPresent_data() QTest::addColumn<int>("bytesB"); QTest::addColumn<int>("bytesPerLineB"); - QList<QPair<QPainterVideoSurface::ShaderType, QByteArray> > types; + const QPair<QPainterVideoSurface::ShaderType, QByteArray> types[] = { #if !defined(QT_OPENGL_ES) - types << qMakePair(QPainterVideoSurface::FragmentProgramShader, QByteArray("ARBfp: ")); + qMakePair(QPainterVideoSurface::FragmentProgramShader, QByteArray("ARBfp: ")), #endif - types << qMakePair(QPainterVideoSurface::GlslShader, QByteArray("GLSL: ")); + qMakePair(QPainterVideoSurface::GlslShader, QByteArray("GLSL: ")), + }; - QPair<QPainterVideoSurface::ShaderType, QByteArray> type; - foreach (type, types) { + for (const auto &type : types) { QTest::newRow((type.second + "rgb32 -> argb32").constData()) << type.first << QVideoFrame::Format_RGB32 diff --git a/tests/auto/unit/qvideosurfaceformat/tst_qvideosurfaceformat.cpp b/tests/auto/unit/qvideosurfaceformat/tst_qvideosurfaceformat.cpp index 5412a838d..4fa754a45 100644 --- a/tests/auto/unit/qvideosurfaceformat/tst_qvideosurfaceformat.cpp +++ b/tests/auto/unit/qvideosurfaceformat/tst_qvideosurfaceformat.cpp @@ -321,7 +321,7 @@ void tst_QVideoSurfaceFormat::scanLineDirection() { QVideoSurfaceFormat format(QSize(16, 16), QVideoFrame::Format_RGB32); - format.setProperty("scanLineDirection", qVariantFromValue(direction)); + format.setProperty("scanLineDirection", QVariant::fromValue(direction)); QCOMPARE(format.scanLineDirection(), direction); QCOMPARE( @@ -363,7 +363,7 @@ void tst_QVideoSurfaceFormat::yCbCrColorSpaceEnum() } { QVideoSurfaceFormat format(QSize(64, 64), QVideoFrame::Format_RGB32); - format.setProperty("yCbCrColorSpace", qVariantFromValue(colorspace)); + format.setProperty("yCbCrColorSpace", QVariant::fromValue(colorspace)); QCOMPARE(format.yCbCrColorSpace(), colorspace); QCOMPARE(qvariant_cast<QVideoSurfaceFormat::YCbCrColorSpace>(format.property("yCbCrColorSpace")), |