diff options
Diffstat (limited to 'src')
87 files changed, 561 insertions, 678 deletions
diff --git a/src/gsttools/qgstappsrc.cpp b/src/gsttools/qgstappsrc.cpp index 823f95655..2d312862d 100644 --- a/src/gsttools/qgstappsrc.cpp +++ b/src/gsttools/qgstappsrc.cpp @@ -195,10 +195,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/qgstreamerplayersession.cpp b/src/gsttools/qgstreamerplayersession.cpp index 24f9b788b..0e4fd2179 100644 --- a/src/gsttools/qgstreamerplayersession.cpp +++ b/src/gsttools/qgstreamerplayersession.cpp @@ -61,9 +61,9 @@ #include <QtCore/qdir.h> #include <QtCore/qstandardpaths.h> #include <qvideorenderercontrol.h> +#include <QUrlQuery> //#define DEBUG_PLAYBIN -//#define DEBUG_VO_BIN_DUMP QT_BEGIN_NAMESPACE @@ -319,7 +319,7 @@ void QGstreamerPlayerSession::loadFromStream(const QNetworkRequest &request, QIO m_appSrc = new QGstAppSrc(this); m_appSrc->setStream(appSrcStream); - if (m_playbin) { + if (!parsePipeline() && m_playbin) { m_tags.clear(); emit tagsChanged(); @@ -351,28 +351,7 @@ void QGstreamerPlayerSession::loadFromUri(const QNetworkRequest &request) } #endif - if (m_request.url().scheme() == QLatin1String("gst-pipeline")) { - // Set current surface to video sink before creating a pipeline. - auto renderer = qobject_cast<QVideoRendererControl*>(m_videoOutput); - if (renderer) - QVideoSurfaceGstSink::setSurface(renderer->surface()); - - QString url = m_request.url().toString(QUrl::RemoveScheme); - QString pipeline = QUrl::fromPercentEncoding(url.toLatin1().constData()); - GError *err = nullptr; - GstElement *element = gst_parse_launch(pipeline.toLatin1().constData(), &err); - if (err) { - auto errstr = QLatin1String(err->message); - qWarning() << "Error:" << pipeline << ":" << errstr; - emit error(QMediaPlayer::FormatError, errstr); - g_clear_error(&err); - } - - setPipeline(element); - return; - } - - if (m_playbin) { + if (!parsePipeline() && m_playbin) { m_tags.clear(); emit tagsChanged(); @@ -387,17 +366,61 @@ void QGstreamerPlayerSession::loadFromUri(const QNetworkRequest &request) } } -void QGstreamerPlayerSession::setPipeline(GstElement *pipeline) +bool QGstreamerPlayerSession::parsePipeline() +{ + if (m_request.url().scheme() != QLatin1String("gst-pipeline")) + return false; + + // Set current surface to video sink before creating a pipeline. + auto renderer = qobject_cast<QVideoRendererControl *>(m_videoOutput); + if (renderer) + QVideoSurfaceGstSink::setSurface(renderer->surface()); + + QString url = m_request.url().toString(QUrl::RemoveScheme); + QString desc = QUrl::fromPercentEncoding(url.toLatin1().constData()); + GError *err = nullptr; + GstElement *pipeline = gst_parse_launch(desc.toLatin1().constData(), &err); + if (err) { + auto errstr = QLatin1String(err->message); + qWarning() << "Error:" << desc << ":" << errstr; + emit error(QMediaPlayer::FormatError, errstr); + g_clear_error(&err); + } + + return setPipeline(pipeline); +} + +static void gst_foreach(GstIterator *it, const std::function<bool(GstElement *)> &cmp) +{ +#if GST_CHECK_VERSION(1,0,0) + GValue value = G_VALUE_INIT; + while (gst_iterator_next (it, &value) == GST_ITERATOR_OK) { + auto child = static_cast<GstElement*>(g_value_get_object(&value)); +#else + GstElement *child = nullptr; + while (gst_iterator_next(it, reinterpret_cast<gpointer *>(&child)) == GST_ITERATOR_OK) { +#endif + if (cmp(child)) + break; + } + + gst_iterator_free(it); +#if GST_CHECK_VERSION(1,0,0) + g_value_unset(&value); +#endif +} + +bool QGstreamerPlayerSession::setPipeline(GstElement *pipeline) { GstBus *bus = pipeline ? gst_element_get_bus(pipeline) : nullptr; if (!bus) - return; + return false; gst_object_unref(GST_OBJECT(m_pipeline)); m_pipeline = pipeline; gst_object_unref(GST_OBJECT(m_bus)); m_bus = bus; - delete m_busHelper; + m_busHelper->deleteLater(); m_busHelper = new QGstreamerBusHelper(m_bus, this); m_busHelper->installMessageFilter(this); @@ -414,24 +437,31 @@ void QGstreamerPlayerSession::setPipeline(GstElement *pipeline) m_videoIdentity = nullptr; if (m_renderer) { - auto it = gst_bin_iterate_sinks(GST_BIN(pipeline)); -#if GST_CHECK_VERSION(1,0,0) - GValue data = { 0, 0 }; - while (gst_iterator_next (it, &data) == GST_ITERATOR_OK) { - auto child = static_cast<GstElement*>(g_value_get_object(&data)); -#else - GstElement *child = nullptr; - while (gst_iterator_next(it, reinterpret_cast<gpointer *>(&child)) == GST_ITERATOR_OK) { -#endif - if (QLatin1String(GST_OBJECT_NAME(child)) == QLatin1String("qtvideosink")) { - m_renderer->setVideoSink(child); - break; - } - } - gst_iterator_free(it); + gst_foreach(gst_bin_iterate_sinks(GST_BIN(pipeline)), + [this](GstElement *child) { + if (qstrcmp(GST_OBJECT_NAME(child), "qtvideosink") == 0) { + m_renderer->setVideoSink(child); + return true; + } + return false; + }); + } + +#if QT_CONFIG(gstreamer_app) + if (m_appSrc) { + gst_foreach(gst_bin_iterate_sources(GST_BIN(pipeline)), + [this](GstElement *child) { + if (qstrcmp(qt_gst_element_get_factory_name(child), "appsrc") == 0) { + m_appSrc->setup(child); + return true; + } + return false; + }); } +#endif emit pipelineChanged(); + return true; } qint64 QGstreamerPlayerSession::duration() const @@ -642,12 +672,6 @@ void QGstreamerPlayerSession::setVideoRenderer(QObject *videoOutput) if (!m_playbin) return; -#ifdef DEBUG_VO_BIN_DUMP - gst_debug_bin_to_dot_file_with_ts(GST_BIN(m_playbin), - GstDebugGraphDetails(GST_DEBUG_GRAPH_SHOW_ALL /* GST_DEBUG_GRAPH_SHOW_MEDIA_TYPE | GST_DEBUG_GRAPH_SHOW_NON_DEFAULT_PARAMS | GST_DEBUG_GRAPH_SHOW_STATES*/), - "playbin_set"); -#endif - GstElement *videoSink = 0; if (m_renderer && m_renderer->isReady()) videoSink = m_renderer->videoSink(); @@ -908,11 +932,6 @@ void QGstreamerPlayerSession::finishVideoOutputChange() gst_object_unref(GST_OBJECT(srcPad)); -#ifdef DEBUG_VO_BIN_DUMP - gst_debug_bin_to_dot_file_with_ts(GST_BIN(m_playbin), - GstDebugGraphDetails(GST_DEBUG_GRAPH_SHOW_ALL /* | GST_DEBUG_GRAPH_SHOW_MEDIA_TYPE | GST_DEBUG_GRAPH_SHOW_NON_DEFAULT_PARAMS | GST_DEBUG_GRAPH_SHOW_STATES */), - "playbin_finish"); -#endif } #if !GST_CHECK_VERSION(1,0,0) @@ -975,6 +994,11 @@ bool QGstreamerPlayerSession::isSeekable() const bool QGstreamerPlayerSession::play() { +#if GST_CHECK_VERSION(1,0,0) + static bool dumpDot = qEnvironmentVariableIsSet("GST_DEBUG_DUMP_DOT_DIR"); + if (dumpDot) + gst_debug_bin_to_dot_file_with_ts(GST_BIN(m_pipeline), GstDebugGraphDetails(GST_DEBUG_GRAPH_SHOW_ALL), "gst.play"); +#endif #ifdef DEBUG_PLAYBIN qDebug() << Q_FUNC_INFO; #endif @@ -1650,6 +1674,14 @@ void QGstreamerPlayerSession::playbinNotifySource(GObject *o, GParamSpec *p, gpo self->m_sourceType = UDPSrc; //The udpsrc is always a live source. self->m_isLiveSource = true; + + QUrlQuery query(self->m_request.url()); + const QString var = QLatin1String("udpsrc.caps"); + if (query.hasQueryItem(var)) { + GstCaps *caps = gst_caps_from_string(query.queryItemValue(var).toLatin1().constData()); + g_object_set(G_OBJECT(source), "caps", caps, NULL); + gst_caps_unref(caps); + } } else if (qstrcmp(G_OBJECT_CLASS_NAME(G_OBJECT_GET_CLASS(source)), "GstSoupHTTPSrc") == 0) { //souphttpsrc timeout unit = second g_object_set(G_OBJECT(source), "timeout", guint(timeout), NULL); diff --git a/src/gsttools/qgstreamerplayersession_p.h b/src/gsttools/qgstreamerplayersession_p.h index b613793c4..d4b050272 100644 --- a/src/gsttools/qgstreamerplayersession_p.h +++ b/src/gsttools/qgstreamerplayersession_p.h @@ -208,7 +208,8 @@ private: void addAudioBufferProbe(); void flushVideoProbes(); void resumeVideoProbes(); - void setPipeline(GstElement *pipeline); + bool parsePipeline(); + bool setPipeline(GstElement *pipeline); QNetworkRequest m_request; QMediaPlayer::State m_state; diff --git a/src/gsttools/qgstutils.cpp b/src/gsttools/qgstutils.cpp index 82af0f1e2..ac8808115 100644 --- a/src/gsttools/qgstutils.cpp +++ b/src/gsttools/qgstutils.cpp @@ -649,7 +649,7 @@ QVector<QGstUtils::CameraInfo> QGstUtils::enumerateCameras(GstElementFactory *fa for (; ::ioctl(fd, VIDIOC_ENUMINPUT, &input) >= 0; ++input.index) { if (input.type == V4L2_INPUT_TYPE_CAMERA || input.type == 0) { const int ret = ::ioctl(fd, VIDIOC_S_INPUT, &input.index); - isCamera = (ret == 0 || errno == ENOTTY); + isCamera = (ret == 0 || errno == ENOTTY || errno == EBUSY); break; } } @@ -1307,9 +1307,7 @@ 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(); diff --git a/src/gsttools/qgstvideorenderersink.cpp b/src/gsttools/qgstvideorenderersink.cpp index 49016b952..5f71d342c 100644 --- a/src/gsttools/qgstvideorenderersink.cpp +++ b/src/gsttools/qgstvideorenderersink.cpp @@ -686,7 +686,8 @@ void QGstVideoRendererSink::handleShowPrerollChange(GObject *o, GParamSpec *p, g if (!showPrerollFrame) { GstState state = GST_STATE_VOID_PENDING; - gst_element_get_state(GST_ELEMENT(sink), &state, NULL, GST_CLOCK_TIME_NONE); + GstClockTime timeout = 10000000; // 10 ms + gst_element_get_state(GST_ELEMENT(sink), &state, NULL, timeout); // show-preroll-frame being set to 'false' while in GST_STATE_PAUSED means // the QMediaPlayer was stopped from the paused state. // We need to flush the current frame. diff --git a/src/imports/multimedia/qdeclarativecamera.cpp b/src/imports/multimedia/qdeclarativecamera.cpp index 63896c302..6d36e462d 100644 --- a/src/imports/multimedia/qdeclarativecamera.cpp +++ b/src/imports/multimedia/qdeclarativecamera.cpp @@ -138,7 +138,7 @@ void QDeclarativeCamera::_q_availabilityChanged(QMultimedia::AvailabilityStatus \header \li Property \li Description \row \li \l {CameraCapture} {imageCapture} \li Methods and properties for capturing still images. - \row \li \l {CameraRecorder} {videoRecording} + \row \li \l {CameraRecorder} {videoRecorder} \li Methods and properties for capturing movies. \row \li \l {CameraExposure} {exposure} \li Methods and properties for adjusting exposure (aperture, shutter speed etc). 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 945fabe52..35234f8bb 100644 --- a/src/multimedia/audio/qsamplecache_p.cpp +++ b/src/multimedia/audio/qsamplecache_p.cpp @@ -295,9 +295,12 @@ void QSample::loadIfNecessary() } } -// Called in both threads +// Called in application thread bool QSampleCache::notifyUnreferencedSample(QSample* sample) { + if (m_loadingThread.isRunning()) + m_loadingThread.wait(); + QMutexLocker locker(&m_mutex); if (m_capacity > 0) return false; @@ -306,16 +309,17 @@ bool QSampleCache::notifyUnreferencedSample(QSample* sample) return true; } -// Called in application threadd +// Called in application thread void QSample::release() { QMutexLocker locker(&m_mutex); #ifdef QT_SAMPLECACHE_DEBUG qDebug() << "Sample:: release" << this << QThread::currentThread() << m_ref; #endif - m_ref--; - if (m_ref == 0) + if (--m_ref == 0) { + locker.unlock(); m_parent->notifyUnreferencedSample(this); + } } // Called in dtor and when stream is loaded 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.h b/src/multimedia/camera/qcamerafocus.h index 31d056de9..024f504e9 100644 --- a/src/multimedia/camera/qcamerafocus.h +++ b/src/multimedia/camera/qcamerafocus.h @@ -152,11 +152,13 @@ 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) diff --git a/src/multimedia/camera/qcameraimageprocessing.h b/src/multimedia/camera/qcameraimageprocessing.h index 3eb7c8569..e4ad00ff8 100644 --- a/src/multimedia/camera/qcameraimageprocessing.h +++ b/src/multimedia/camera/qcameraimageprocessing.h @@ -116,11 +116,13 @@ 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) diff --git a/src/multimedia/doc/qtmultimedia.qdocconf b/src/multimedia/doc/qtmultimedia.qdocconf index 256ad261e..dfafd8715 100644 --- a/src/multimedia/doc/qtmultimedia.qdocconf +++ b/src/multimedia/doc/qtmultimedia.qdocconf @@ -1,4 +1,5 @@ include($QT_INSTALL_DOCS/global/qt-module-defaults.qdocconf) +include($QT_INSTALL_DOCS/config/exampleurl-qtmultimedia.qdocconf) project = QtMultimedia description = Qt Multimedia Documentation 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 7cabfabf3..60097d917 100644 --- a/src/multimedia/doc/snippets/multimedia-snippets/media.cpp +++ b/src/multimedia/doc/snippets/multimedia-snippets/media.cpp @@ -223,10 +223,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/qmediatimerange.h b/src/multimedia/qmediatimerange.h index 0b4fe8e67..5b6d711af 100644 --- a/src/multimedia/qmediatimerange.h +++ b/src/multimedia/qmediatimerange.h @@ -55,6 +55,7 @@ public: QMediaTimeInterval(); QMediaTimeInterval(qint64 start, qint64 end); QMediaTimeInterval(const QMediaTimeInterval&); + QMediaTimeInterval &operator=(const QMediaTimeInterval&) = default; qint64 start() const; qint64 end() const; diff --git a/src/multimediawidgets/qpaintervideosurface.cpp b/src/multimediawidgets/qpaintervideosurface.cpp index e4762a7e1..6af0c7588 100644 --- a/src/multimediawidgets/qpaintervideosurface.cpp +++ b/src/multimediawidgets/qpaintervideosurface.cpp @@ -57,6 +57,15 @@ #ifndef GL_RGB8 #define GL_RGB8 0x8051 #endif + +static void makeCurrent(QGLContext *context) +{ + context->makeCurrent(); + + auto handle = context->contextHandle(); + if (handle && QOpenGLContext::currentContext() != handle) + handle->makeCurrent(handle->surface()); +} #endif #include <QtDebug> @@ -395,7 +404,7 @@ QAbstractVideoSurface::Error QVideoSurfaceGLPainter::setCurrentFrame(const QVide glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); } else if (m_frame.map(QAbstractVideoBuffer::ReadOnly)) { - m_context->makeCurrent(); + makeCurrent(m_context); for (int i = 0; i < m_textureCount; ++i) { glBindTexture(GL_TEXTURE_2D, m_textureIds[i]); @@ -737,7 +746,7 @@ QAbstractVideoSurface::Error QVideoSurfaceArbFpPainter::start(const QVideoSurfac QAbstractVideoSurface::Error error = QAbstractVideoSurface::NoError; - m_context->makeCurrent(); + makeCurrent(m_context); const char *program = 0; @@ -862,7 +871,7 @@ QAbstractVideoSurface::Error QVideoSurfaceArbFpPainter::start(const QVideoSurfac void QVideoSurfaceArbFpPainter::stop() { if (m_context) { - m_context->makeCurrent(); + makeCurrent(m_context); if (m_handleType != QAbstractVideoBuffer::GLTextureHandle) glDeleteTextures(m_textureCount, m_textureIds); @@ -1115,7 +1124,7 @@ QAbstractVideoSurface::Error QVideoSurfaceGlslPainter::start(const QVideoSurface QAbstractVideoSurface::Error error = QAbstractVideoSurface::NoError; - m_context->makeCurrent(); + makeCurrent(m_context); const char *fragmentProgram = 0; @@ -1222,7 +1231,7 @@ QAbstractVideoSurface::Error QVideoSurfaceGlslPainter::start(const QVideoSurface void QVideoSurfaceGlslPainter::stop() { if (m_context) { - m_context->makeCurrent(); + makeCurrent(m_context); if (m_handleType != QAbstractVideoBuffer::GLTextureHandle) glDeleteTextures(m_textureCount, m_textureIds); @@ -1623,7 +1632,7 @@ void QPainterVideoSurface::setGLContext(QGLContext *context) //Set a dynamic property to access the OpenGL context this->setProperty("GLContext", QVariant::fromValue<QObject*>(m_glContext->contextHandle())); - m_glContext->makeCurrent(); + makeCurrent(m_glContext); const QByteArray extensions(reinterpret_cast<const char *>( context->contextHandle()->functions()->glGetString(GL_EXTENSIONS))); @@ -1734,13 +1743,13 @@ void QPainterVideoSurface::createPainter() #if !defined(QT_OPENGL_ES) && !defined(QT_OPENGL_DYNAMIC) case FragmentProgramShader: Q_ASSERT(m_glContext); - m_glContext->makeCurrent(); + makeCurrent(m_glContext); m_painter = new QVideoSurfaceArbFpPainter(m_glContext); break; #endif // !QT_OPENGL_ES && !QT_OPENGL_DYNAMIC case GlslShader: Q_ASSERT(m_glContext); - m_glContext->makeCurrent(); + makeCurrent(m_glContext); m_painter = new QVideoSurfaceGlslPainter(m_glContext); break; default: 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/wrappers/jni/androidcamera.cpp b/src/plugins/android/src/wrappers/jni/androidcamera.cpp index 90af0119a..a92a3373a 100644 --- a/src/plugins/android/src/wrappers/jni/androidcamera.cpp +++ b/src/plugins/android/src/wrappers/jni/androidcamera.cpp @@ -942,7 +942,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; @@ -1541,7 +1541,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; 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/avfmediarecordercontrol.mm b/src/plugins/avfoundation/camera/avfmediarecordercontrol.mm index 9a6057e6b..f8f4500c1 100644 --- a/src/plugins/avfoundation/camera/avfmediarecordercontrol.mm +++ b/src/plugins/avfoundation/camera/avfmediarecordercontrol.mm @@ -294,6 +294,8 @@ void AVFMediaRecorderControl::setState(QMediaRecorder::State state) m_recordingFinished = false; Q_EMIT actualLocationChanged(actualLocation); + updateStatus(); + Q_EMIT stateChanged(m_state); } else { Q_EMIT error(QMediaRecorder::FormatError, tr("Recorder not configured")); } @@ -312,10 +314,6 @@ void AVFMediaRecorderControl::setState(QMediaRecorder::State state) unapplySettings(); } } - - updateStatus(); - if (state != m_state) - Q_EMIT stateChanged(m_state); } void AVFMediaRecorderControl::setMuted(bool muted) 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.h b/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.h index f6e0ef3bf..7a268a3d9 100644 --- a/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.h +++ b/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.h @@ -125,43 +125,6 @@ Q_SIGNALS: void error(int error, const QString &errorString); private: - class ResourceHandler { - public: - ResourceHandler() : resource(nullptr) {} - ~ResourceHandler() { clear(); } - void setResourceFile(const QString &file) { - if (resource) { - if (resource->fileName() == file) - return; - delete resource; - rawData.clear(); - } - resource = new QResource(file); - } - bool isValid() const { return resource && resource->isValid() && resource->data() != nullptr; } - const uchar *data() { - if (!isValid()) - return nullptr; - if (resource->isCompressed()) { - if (rawData.size() == 0) - rawData = qUncompress(resource->data(), resource->size()); - return (const uchar *)rawData.constData(); - } - return resource->data(); - } - qint64 size() { - if (data() == nullptr) - return 0; - return resource->isCompressed() ? rawData.size() : resource->size(); - } - void clear() { - delete resource; - rawData.clear(); - } - QResource *resource; - QByteArray rawData; - }; - void setAudioAvailable(bool available); void setVideoAvailable(bool available); void setSeekable(bool seekable); @@ -173,7 +136,6 @@ private: QMediaPlayer::MediaStatus m_mediaStatus; QIODevice *m_mediaStream; QMediaContent m_resources; - ResourceHandler m_resourceHandler; bool m_muted; bool m_tryingAsync; diff --git a/src/plugins/common/evr/evrcustompresenter.cpp b/src/plugins/common/evr/evrcustompresenter.cpp index 84786e9a9..3de8d3ac3 100644 --- a/src/plugins/common/evr/evrcustompresenter.cpp +++ b/src/plugins/common/evr/evrcustompresenter.cpp @@ -1029,7 +1029,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/evrd3dpresentengine.cpp b/src/plugins/common/evr/evrd3dpresentengine.cpp index ab694b795..4ce5a99d7 100644 --- a/src/plugins/common/evr/evrd3dpresentengine.cpp +++ b/src/plugins/common/evr/evrd3dpresentengine.cpp @@ -593,16 +593,6 @@ QVideoFrame D3DPresentEngine::makeVideoFrame(IMFSample *sample) m_surfaceFormat.frameSize(), m_surfaceFormat.pixelFormat()); - // WMF uses 100-nanosecond units, Qt uses microseconds - LONGLONG startTime = -1; - if (SUCCEEDED(sample->GetSampleTime(&startTime))) { - frame.setStartTime(startTime * 0.1); - - LONGLONG duration = -1; - if (SUCCEEDED(sample->GetSampleDuration(&duration))) - frame.setEndTime((startTime + duration) * 0.1); - } - return frame; } 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 5ab9f67d8..27cdd84db 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, SIGNAL(statusChanged(QCamera::Status)), this, SLOT(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; @@ -331,10 +314,10 @@ void DSCameraSession::setImageProcessingParameter( return; } - IAMVideoProcAmp *pVideoProcAmp = NULL; + IAMVideoProcAmp *pVideoProcAmp = nullptr; HRESULT hr = m_graphBuilder->FindInterface( - NULL, - NULL, + nullptr, + nullptr, m_sourceFilter, IID_IAMVideoProcAmp, reinterpret_cast<void**>(&pVideoProcAmp) @@ -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)) { @@ -702,12 +685,12 @@ bool DSCameraSession::createFilterGraph() QString errorString; HRESULT hr; - IMoniker* pMoniker = NULL; - ICreateDevEnum* pDevEnum = NULL; - IEnumMoniker* pEnum = NULL; + IMoniker* pMoniker = nullptr; + ICreateDevEnum* pDevEnum = nullptr; + IEnumMoniker* pEnum = nullptr; // Create the filter graph - hr = CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC, + hr = CoCreateInstance(CLSID_FilterGraph,nullptr,CLSCTX_INPROC, IID_IGraphBuilder, reinterpret_cast<void**>(&m_filterGraph)); if (FAILED(hr)) { errorString = tr("Failed to create filter graph"); @@ -715,7 +698,7 @@ bool DSCameraSession::createFilterGraph() } // Create the capture graph builder - hr = CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC, + hr = CoCreateInstance(CLSID_CaptureGraphBuilder2, nullptr, CLSCTX_INPROC, IID_ICaptureGraphBuilder2, reinterpret_cast<void**>(&m_graphBuilder)); if (FAILED(hr)) { @@ -731,7 +714,7 @@ bool DSCameraSession::createFilterGraph() } // Find the Capture device - hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, + hr = CoCreateInstance(CLSID_SystemDeviceEnum, nullptr, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, reinterpret_cast<void**>(&pDevEnum)); if (SUCCEEDED(hr)) { @@ -740,13 +723,13 @@ 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, NULL) == S_OK) { + while (pEnum->Next(1, &pMoniker, nullptr) == S_OK) { - BSTR strName = 0; - hr = pMoniker->GetDisplayName(NULL, NULL, &strName); + BSTR strName = nullptr; + hr = pMoniker->GetDisplayName(nullptr, nullptr, &strName); if (SUCCEEDED(hr)) { QString output = QString::fromWCharArray(strName); mallocInterface->Free(strName); @@ -762,14 +745,14 @@ bool DSCameraSession::createFilterGraph() pMoniker->Release(); } mallocInterface->Release(); - if (NULL == m_sourceFilter) + if (nullptr == m_sourceFilter) { if (m_sourceDeviceName.contains(QLatin1String("default"))) { pEnum->Reset(); // still have to loop to discard bind to storage failure case - while (pEnum->Next(1, &pMoniker, NULL) == S_OK) { - IPropertyBag *pPropBag = 0; + while (pEnum->Next(1, &pMoniker, nullptr) == S_OK) { + 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"); } } } @@ -813,7 +792,7 @@ bool DSCameraSession::createFilterGraph() // Null renderer. Input connected to the sample grabber's output. Simply // discard the samples it receives. - hr = CoCreateInstance(cLSID_NullRenderer, NULL, CLSCTX_INPROC, + hr = CoCreateInstance(cLSID_NullRenderer, nullptr, CLSCTX_INPROC, IID_IBaseFilter, (void**)&m_nullRendererFilter); if (FAILED(hr)) { errorString = tr("Failed to create null renderer"); @@ -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)); @@ -931,10 +910,10 @@ void DSCameraSession::updateImageProcessingParametersInfos() return; } - IAMVideoProcAmp *pVideoProcAmp = NULL; + IAMVideoProcAmp *pVideoProcAmp = nullptr; const HRESULT hr = m_graphBuilder->FindInterface( - NULL, - NULL, + nullptr, + nullptr, m_sourceFilter, IID_IAMVideoProcAmp, reinterpret_cast<void**>(&pVideoProcAmp) @@ -1041,10 +1020,10 @@ void DSCameraSession::disconnectGraph() { // To avoid increasing the memory usage every time the graph is re-connected it's // important that all filters are released; also the ones added by the "Intelligent Connect". - IEnumFilters *enumFilters = NULL; + IEnumFilters *enumFilters = nullptr; if (SUCCEEDED(m_filterGraph->EnumFilters(&enumFilters))) { - IBaseFilter *filter = NULL; - while (enumFilters->Next(1, &filter, NULL) == S_OK) { + IBaseFilter *filter = nullptr; + while (enumFilters->Next(1, &filter, nullptr) == S_OK) { m_filterGraph->RemoveFilter(filter); enumFilters->Reset(); filter->Release(); @@ -1061,24 +1040,24 @@ static bool qt_frameRateRangeGreaterThan(const QCamera::FrameRateRange &r1, cons void DSCameraSession::updateSourceCapabilities() { HRESULT hr; - AM_MEDIA_TYPE *pmt = NULL; - VIDEOINFOHEADER *pvi = NULL; + 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,15 +1109,15 @@ 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() }; - if (SUCCEEDED(pVideoControl->GetFrameRateList(pPin, iIndex, size, - &listSize, &frameRates))) { + hr = pVideoControl->GetFrameRateList(pPin, iIndex, size, &listSize, &frameRates); + if (hr == S_OK && listSize > 0 && frameRates) { for (long i = 0; i < listSize; ++i) { qreal fr = qreal(10000000) / frameRates[i]; frameRateRanges.append(QCamera::FrameRateRange(fr, fr)); @@ -1147,6 +1126,8 @@ void DSCameraSession::updateSourceCapabilities() // Make sure higher frame rates come first std::sort(frameRateRanges.begin(), frameRateRanges.end(), qt_frameRateRangeGreaterThan); } + + CoTaskMemFree(frameRates); pPin->Release(); } } 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 2c1fab764..0f08154f1 100644 --- a/src/plugins/directshow/camera/dsvideodevicecontrol.cpp +++ b/src/plugins/directshow/camera/dsvideodevicecontrol.cpp @@ -129,10 +129,10 @@ void DSVideoDeviceControl::updateDevices() deviceList->clear(); - ICreateDevEnum* pDevEnum = NULL; - IEnumMoniker* pEnum = NULL; + ICreateDevEnum* pDevEnum = nullptr; + IEnumMoniker* pEnum = nullptr; // Create the System device enumerator - HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, + HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, nullptr, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, reinterpret_cast<void**>(&pDevEnum)); if (SUCCEEDED(hr)) { @@ -142,12 +142,12 @@ void DSVideoDeviceControl::updateDevices() if (S_OK == hr) { pEnum->Reset(); // go through and find all video capture devices - IMoniker* pMoniker = NULL; - IMalloc *mallocInterface = 0; + IMoniker* pMoniker = nullptr; + IMalloc *mallocInterface = nullptr; CoGetMalloc(1, (LPMALLOC*)&mallocInterface); - while (pEnum->Next(1, &pMoniker, NULL) == S_OK) { - BSTR strName = 0; - hr = pMoniker->GetDisplayName(NULL, NULL, &strName); + while (pEnum->Next(1, &pMoniker, nullptr) == S_OK) { + BSTR strName = nullptr; + hr = pMoniker->GetDisplayName(nullptr, nullptr, &strName); if (SUCCEEDED(hr)) { QString output(QString::fromWCharArray(strName)); mallocInterface->Free(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 2792dc3c6..dfea2460f 100644 --- a/src/plugins/directshow/common/directshowbasefilter.cpp +++ b/src/plugins/directshow/common/directshowbasefilter.cpp @@ -45,10 +45,6 @@ QT_BEGIN_NAMESPACE DirectShowBaseFilter::DirectShowBaseFilter() : m_mutex(QMutex::Recursive) - , m_state(State_Stopped) - , m_graph(NULL) - , m_clock(NULL) - , m_sink(NULL) { } @@ -57,7 +53,7 @@ DirectShowBaseFilter::~DirectShowBaseFilter() { if (m_clock) { m_clock->Release(); - m_clock = NULL; + m_clock = nullptr; } } @@ -75,9 +71,8 @@ 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) @@ -207,7 +202,7 @@ HRESULT DirectShowBaseFilter::FindPin(LPCWSTR Id, IPin **ppPin) } } - *ppPin = 0; + *ppPin = nullptr; return VFW_E_NOT_FOUND; } @@ -217,7 +212,7 @@ HRESULT DirectShowBaseFilter::JoinFilterGraph(IFilterGraph *pGraph, LPCWSTR pNam m_filterName = QString::fromWCharArray(pName); m_graph = pGraph; - m_sink = NULL; + m_sink = nullptr; if (m_graph) { if (SUCCEEDED(m_graph->QueryInterface(IID_PPV_ARGS(&m_sink)))) diff --git a/src/plugins/directshow/common/directshowbasefilter.h b/src/plugins/directshow/common/directshowbasefilter.h index fe78f96b2..ea5b8fafe 100644 --- a/src/plugins/directshow/common/directshowbasefilter.h +++ b/src/plugins/directshow/common/directshowbasefilter.h @@ -79,12 +79,12 @@ public: protected: QMutex m_mutex; - FILTER_STATE m_state; - IFilterGraph *m_graph; - IReferenceClock *m_clock; - IMediaEventSink *m_sink; + 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 fbc7b8cee..a38c26ef4 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,15 +61,13 @@ 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(0, 0, 0, 0)) - , m_waitHandle(::CreateEvent(0, 0, 0, 0)) + , m_eventHandle(::CreateEvent(nullptr, 0, 0, nullptr)) + , m_waitHandle(::CreateEvent(nullptr, 0, 0, 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 5f391710e..12693e4f1 100644 --- a/src/plugins/directshow/common/directshowglobal.h +++ b/src/plugins/directshow/common/directshowglobal.h @@ -53,35 +53,35 @@ 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, - NULL, + 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, - NULL, + nullptr, CLSCTX_INPROC_SERVER, iid, reinterpret_cast<void **>(&object)) == S_OK ? object - : 0; + : nullptr; } DEFINE_GUID(MEDIASUBTYPE_I420, diff --git a/src/plugins/directshow/common/directshowmediatype.cpp b/src/plugins/directshow/common/directshowmediatype.cpp index fe86e0204..103f1ddc1 100644 --- a/src/plugins/directshow/common/directshowmediatype.cpp +++ b/src/plugins/directshow/common/directshowmediatype.cpp @@ -52,7 +52,7 @@ namespace { { QVideoFrame::Format_ARGB32, MEDIASUBTYPE_ARGB32 }, { QVideoFrame::Format_RGB32, MEDIASUBTYPE_RGB32 }, - { QVideoFrame::Format_RGB24, MEDIASUBTYPE_RGB24 }, + { QVideoFrame::Format_BGR24, MEDIASUBTYPE_RGB24 }, { QVideoFrame::Format_RGB565, MEDIASUBTYPE_RGB565 }, { QVideoFrame::Format_RGB555, MEDIASUBTYPE_RGB555 }, { QVideoFrame::Format_AYUV444, MEDIASUBTYPE_AYUV }, diff --git a/src/plugins/directshow/common/directshowmediatypeenum.cpp b/src/plugins/directshow/common/directshowmediatypeenum.cpp index 10623a246..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(NULL) - , 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 508a9b21d..390d410a4 100644 --- a/src/plugins/directshow/common/directshowpin.cpp +++ b/src/plugins/directshow/common/directshowpin.cpp @@ -52,7 +52,6 @@ DirectShowPin::DirectShowPin(DirectShowBaseFilter *filter, const QString &name, , m_filter(filter) , m_name(name) , m_direction(direction) - , m_peerPin(NULL) { } @@ -76,11 +75,11 @@ HRESULT DirectShowPin::Connect(IPin *pReceivePin, const AM_MEDIA_TYPE *pmt) if (pd == m_direction) return VFW_E_INVALID_DIRECTION; - if (pmt != NULL && DirectShowMediaType::isPartiallySpecified(pmt)) { + if (pmt != nullptr && DirectShowMediaType::isPartiallySpecified(pmt)) { // If the type is fully specified, use it hr = tryConnect(pReceivePin, pmt); } else { - IEnumMediaTypes *enumMediaTypes = NULL; + IEnumMediaTypes *enumMediaTypes = nullptr; // First, try the receiving pin's preferred types if (SUCCEEDED(pReceivePin->EnumMediaTypes(&enumMediaTypes))) { @@ -108,13 +107,13 @@ HRESULT DirectShowPin::tryMediaTypes(IPin *pin, const AM_MEDIA_TYPE *partialType if (FAILED(hr)) return hr; - AM_MEDIA_TYPE *mediaType = NULL; + AM_MEDIA_TYPE *mediaType = nullptr; ULONG mediaCount = 0; HRESULT hrFailure = VFW_E_NO_ACCEPTABLE_TYPES; for (; enumMediaTypes->Next(1, &mediaType, &mediaCount) == S_OK;) { - if (mediaType && (partialType == NULL || DirectShowMediaType::isCompatible(mediaType, partialType))) { + if (mediaType && (partialType == nullptr || DirectShowMediaType::isCompatible(mediaType, partialType))) { hr = tryConnect(pin, mediaType); if (FAILED(hr) && (hr != E_FAIL) @@ -157,8 +156,8 @@ HRESULT DirectShowPin::tryConnect(IPin *pin, const AM_MEDIA_TYPE *type) if (FAILED(hr)) { connectionEnded(); m_peerPin->Release(); - m_peerPin = NULL; - setMediaType(NULL); + m_peerPin = nullptr; + setMediaType(nullptr); return hr; } @@ -197,8 +196,8 @@ HRESULT DirectShowPin::ReceiveConnection(IPin *pConnector, const AM_MEDIA_TYPE * if (FAILED(hr)) { connectionEnded(); m_peerPin->Release(); - m_peerPin = NULL; - setMediaType(NULL); + m_peerPin = nullptr; + setMediaType(nullptr); return hr; } @@ -218,9 +217,9 @@ HRESULT DirectShowPin::Disconnect() return hr; m_peerPin->Release(); - m_peerPin = NULL; + m_peerPin = nullptr; - setMediaType(NULL); + setMediaType(nullptr); return S_OK; } @@ -235,7 +234,7 @@ HRESULT DirectShowPin::ConnectedTo(IPin **ppPin) QMutexLocker locker(&m_mutex); if (!m_peerPin) { - *ppPin = 0; + *ppPin = nullptr; return VFW_E_NOT_CONNECTED; } m_peerPin->AddRef(); @@ -380,8 +379,6 @@ HRESULT DirectShowPin::setActive(bool active) DirectShowOutputPin::DirectShowOutputPin(DirectShowBaseFilter *filter, const QString &name) : DirectShowPin(filter, name, PINDIR_OUTPUT) - , m_allocator(NULL) - , m_inputPin(NULL) { } @@ -393,8 +390,8 @@ HRESULT DirectShowOutputPin::completeConnection(IPin *pin) if (!pin) return E_POINTER; - Q_ASSERT(m_inputPin == NULL); - Q_ASSERT(m_allocator == NULL); + Q_ASSERT(m_inputPin == nullptr); + Q_ASSERT(m_allocator == nullptr); HRESULT hr = pin->QueryInterface(IID_PPV_ARGS(&m_inputPin)); if (FAILED(hr)) @@ -423,7 +420,7 @@ HRESULT DirectShowOutputPin::completeConnection(IPin *pin) } m_allocator->Release(); - m_allocator = NULL; + m_allocator = nullptr; } // Otherwise, allocate its own allocator @@ -441,7 +438,7 @@ HRESULT DirectShowOutputPin::completeConnection(IPin *pin) } m_allocator->Release(); - m_allocator = NULL; + m_allocator = nullptr; } return hr; @@ -455,12 +452,12 @@ HRESULT DirectShowOutputPin::connectionEnded() return hr; m_allocator->Release(); - m_allocator = NULL; + m_allocator = nullptr; } if (m_inputPin) { m_inputPin->Release(); - m_inputPin = NULL; + m_inputPin = nullptr; } return S_OK; @@ -485,9 +482,6 @@ HRESULT DirectShowOutputPin::EndOfStream() DirectShowInputPin::DirectShowInputPin(DirectShowBaseFilter *filter, const QString &name) : DirectShowPin(filter, name, PINDIR_INPUT) - , m_allocator(NULL) - , m_flushing(false) - , m_inErrorState(false) { ZeroMemory(&m_sampleProperties, sizeof(m_sampleProperties)); } @@ -502,7 +496,7 @@ HRESULT DirectShowInputPin::connectionEnded() return hr; m_allocator->Release(); - m_allocator = NULL; + m_allocator = nullptr; } return S_OK; diff --git a/src/plugins/directshow/common/directshowpin.h b/src/plugins/directshow/common/directshowpin.h index 5e513d002..bb5a07ad7 100644 --- a/src/plugins/directshow/common/directshowpin.h +++ b/src/plugins/directshow/common/directshowpin.h @@ -56,7 +56,7 @@ public: virtual ~DirectShowPin(); QString name() const { return m_name; } - bool isConnected() const { return m_peerPin != NULL; } + bool isConnected() const { return m_peerPin != nullptr; } virtual bool isMediaTypeSupported(const AM_MEDIA_TYPE *type) = 0; virtual QList<DirectShowMediaType> supportedMediaTypes(); @@ -102,7 +102,7 @@ protected: 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 20fa93d6e..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(NULL) - , 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 fec59b538..a9e74f9db 100644 --- a/src/plugins/directshow/common/directshowsamplegrabber.cpp +++ b/src/plugins/directshow/common/directshowsamplegrabber.cpp @@ -75,14 +75,15 @@ public: STDMETHODIMP QueryInterface(REFIID riid, void **ppvObject) override { - if (NULL == ppvObject) + if (nullptr == ppvObject) return E_POINTER; if (riid == IID_IUnknown /*__uuidof(IUnknown) */ ) { 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,12 +116,9 @@ 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, NULL, CLSCTX_INPROC, iID_ISampleGrabber, reinterpret_cast<void **>(&m_sampleGrabber)); + HRESULT hr = CoCreateInstance(cLSID_SampleGrabber, nullptr, CLSCTX_INPROC, iID_ISampleGrabber, reinterpret_cast<void **>(&m_sampleGrabber)); if (FAILED(hr)) { qCWarning(qtDirectShowPlugin, "Failed to create sample grabber"); 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 d1c1d42ab..21b86926f 100644 --- a/src/plugins/directshow/common/directshowutils.cpp +++ b/src/plugins/directshow/common/directshowutils.cpp @@ -117,7 +117,7 @@ bool DirectShowUtils::getPin(IBaseFilter *filter, PIN_DIRECTION pinDirection, IP enumPins->Reset(); IPin *nextPin = nullptr; - while (enumPins->Next(1, &nextPin, NULL) == S_OK) { + while (enumPins->Next(1, &nextPin, nullptr) == S_OK) { const ScopedSafeRelease<IPin> releasePin { &nextPin }; PIN_DIRECTION currentPinDir; *hrOut = nextPin->QueryDirection(¤tPinDir); @@ -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/directshow.pro b/src/plugins/directshow/directshow.pro index e531efc53..27bb3abb8 100644 --- a/src/plugins/directshow/directshow.pro +++ b/src/plugins/directshow/directshow.pro @@ -16,6 +16,10 @@ mingw { DEFINES += NO_DSHOW_STRSAFE } +mingw { + LIBS_PRIVATE += -lamstrmid +} + include(common/common.pri) include(player/player.pri) include(camera/camera.pri) diff --git a/src/plugins/directshow/dsserviceplugin.cpp b/src/plugins/directshow/dsserviceplugin.cpp index 727a11b55..e22bfe93b 100644 --- a/src/plugins/directshow/dsserviceplugin.cpp +++ b/src/plugins/directshow/dsserviceplugin.cpp @@ -78,7 +78,7 @@ static int g_refCount = 0; void addRefCount() { if (++g_refCount == 1) - CoInitialize(NULL); + CoInitialize(nullptr); } void releaseRefCount() @@ -99,7 +99,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 fc1058d57..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(NULL) { } @@ -59,7 +58,7 @@ IBaseFilter *DirectShowEvrVideoWindowControl::filter() m_evrFilter = com_new<IBaseFilter>(clsid_EnhancedVideoRenderer); if (!setEvr(m_evrFilter)) { m_evrFilter->Release(); - m_evrFilter = NULL; + 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 3482cee02..b903038ea 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 2d0ee2d59..7e1413b56 100644 --- a/src/plugins/directshow/player/directshowplayercontrol.cpp +++ b/src/plugins/directshow/player/directshowplayercontrol.cpp @@ -50,19 +50,6 @@ DirectShowPlayerControl::DirectShowPlayerControl(DirectShowPlayerService *service, QObject *parent) : QMediaPlayerControl(parent) , m_service(service) - , m_audio(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) { } @@ -219,6 +206,9 @@ const QIODevice *DirectShowPlayerControl::mediaStream() const void DirectShowPlayerControl::setMedia(const QMediaContent &media, QIODevice *stream) { + if (m_media == media) + return; + m_pendingPosition = -1; m_emitPosition = -1; 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 059e253f1..56a428028 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(0, 0, 0, 0)) - , 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_taskHandle(::CreateEvent(nullptr, 0, 0, nullptr)) { 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; @@ -354,7 +330,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")) { @@ -367,14 +343,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(); @@ -408,8 +384,6 @@ void DirectShowPlayerService::doSetUrlSource(QMutexLocker *locker) m_pendingTasks |= SetRate; m_source = source; - } else if (!m_url.isEmpty()) { - m_pendingTasks |= SetUrlSource; } else { m_graphStatus = InvalidMedia; @@ -511,18 +485,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,10 +504,17 @@ void DirectShowPlayerService::doRender(QMutexLocker *locker) peer->Release(); } else { locker->unlock(); - HRESULT hr = graph->RenderEx(pin, /*AM_RENDEREX_RENDERTOEXISTINGRENDERERS*/ 1, 0); - // Do not return an error if no video output is set yet. - if (SUCCEEDED(hr) || !(m_executedTasks & SetVideoOutput)) { + HRESULT hr = graph->RenderEx(pin, /*AM_RENDEREX_RENDERTOEXISTINGRENDERERS*/ 1, nullptr); + if (SUCCEEDED(hr)) { + rendered = true; + m_error = QMediaPlayer::NoError; + } else if (!(m_executedTasks & SetVideoOutput)) { + // Do not return an error if no video output is set yet. rendered = true; + // Remember the error in this case. + // Handle it when playing is requested and no video output has been provided. + m_error = QMediaPlayer::ResourceError; + m_errorString = QString("%1: %2").arg(__FUNCTION__).arg(qt_error_string(hr)); } else if (renderHr == S_OK || renderHr == VFW_E_NO_DECOMPRESSOR){ renderHr = hr; } @@ -675,13 +656,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(); @@ -819,17 +800,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; @@ -862,8 +843,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; @@ -914,6 +895,16 @@ void DirectShowPlayerService::play() void DirectShowPlayerService::doPlay(QMutexLocker *locker) { + // Invalidate if there is an error while loading. + if (m_error != QMediaPlayer::NoError) { + m_graphStatus = InvalidMedia; + if (!m_errorString.isEmpty()) + qWarning("%s", qPrintable(m_errorString)); + m_errorString = QString(); + QCoreApplication::postEvent(this, new QEvent(QEvent::Type(Error))); + return; + } + if (IMediaControl *control = com_cast<IMediaControl>(m_graph, IID_IMediaControl)) { locker->unlock(); HRESULT hr = control->Run(); @@ -1165,7 +1156,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) { @@ -1191,7 +1182,7 @@ int DirectShowPlayerService::bufferStatus() const m_source, IID_IWMReaderAdvanced2)) { DWORD percentage = 0; - reader->GetBufferProgress(&percentage, 0); + reader->GetBufferProgress(&percentage, nullptr); reader->Release(); return percentage; @@ -1364,7 +1355,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(); @@ -1615,7 +1606,7 @@ void DirectShowPlayerService::updateStatus() m_playerControl->updateStatus(QMediaPlayer::LoadingMedia); break; case Loaded: - if ((m_pendingTasks | m_executingTask | m_executedTasks) & (Play | Pause)) { + if ((m_executingTask | m_executedTasks) & (Play | Pause)) { if (m_buffering) m_playerControl->updateStatus(QMediaPlayer::BufferingMedia); else @@ -1636,13 +1627,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; @@ -1658,15 +1649,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 88b5a51eb..19be82141 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; @@ -103,9 +98,9 @@ void DirectShowVideoRendererControl::setSurface(QAbstractVideoSurface *surface) m_evrPresenter = new EVRCustomPresenter(m_surface); 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 b2abeeaed..dcbcadb4b 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; @@ -71,10 +71,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 74d59231c..8dd18dc1b 100644 --- a/src/plugins/directshow/player/videosurfacefilter.cpp +++ b/src/plugins/directshow/player/videosurfacefilter.cpp @@ -222,20 +222,10 @@ HRESULT VideoSurfaceInputPin::Receive(IMediaSample *pMediaSample) VideoSurfaceFilter::VideoSurfaceFilter(QAbstractVideoSurface *surface, DirectShowEventLoop *loop, QObject *parent) : QObject(parent) , m_loop(loop) - , m_pin(NULL) , m_surface(surface) - , m_bytesPerLine(0) - , m_surfaceStarted(false) , m_renderMutex(QMutex::Recursive) - , m_running(false) - , m_pendingSample(NULL) - , m_pendingSampleEndTime(0) - , m_renderEvent(CreateEvent(NULL, FALSE, FALSE, NULL)) - , m_flushEvent(CreateEvent(NULL, TRUE, FALSE, NULL)) - , m_adviseCookie(0) - , m_EOS(false) - , m_EOSDelivered(false) - , m_EOSTimer(0) + , m_renderEvent(CreateEvent(nullptr, FALSE, FALSE, nullptr)) + , m_flushEvent(CreateEvent(nullptr, TRUE, FALSE, nullptr)) { supportedFormatsChanged(); connect(surface, &QAbstractVideoSurface::supportedFormatsChanged, @@ -616,7 +606,7 @@ void VideoSurfaceFilter::clearPendingSample() if (m_pendingSample) { qCDebug(qLcRenderFilter, "clearPendingSample"); m_pendingSample->Release(); - m_pendingSample = NULL; + m_pendingSample = nullptr; } } @@ -713,11 +703,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 +730,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() diff --git a/src/plugins/directshow/player/videosurfacefilter.h b/src/plugins/directshow/player/videosurfacefilter.h index 56791f270..f11d015f1 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; + 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/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 40294214a..361a2369a 100644 --- a/src/plugins/gstreamer/mediacapture/qgstreameraudioencode.cpp +++ b/src/plugins/gstreamer/mediacapture/qgstreameraudioencode.cpp @@ -214,9 +214,7 @@ GstElement *QGstreamerAudioEncode::createEncoder() } QMap<QString, QVariant> options = m_options.value(codec); - QMapIterator<QString,QVariant> it(options); - while (it.hasNext()) { - it.next(); + for (auto it = options.cbegin(), end = options.cend(); it != end; ++it) { QString option = it.key(); QVariant value = it.value(); diff --git a/src/plugins/gstreamer/mediacapture/qgstreamervideoencode.cpp b/src/plugins/gstreamer/mediacapture/qgstreamervideoencode.cpp index 6b4dbe4b7..674e1034e 100644 --- a/src/plugins/gstreamer/mediacapture/qgstreamervideoencode.cpp +++ b/src/plugins/gstreamer/mediacapture/qgstreamervideoencode.cpp @@ -204,9 +204,7 @@ GstElement *QGstreamerVideoEncode::createEncoder() } QMap<QString,QVariant> options = m_options.value(codec); - QMapIterator<QString,QVariant> it(options); - while (it.hasNext()) { - it.next(); + for (auto it = options.cbegin(), end = options.cend(); it != end; ++it) { QString option = it.key(); QVariant value = it.value(); 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/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/windowsaudio/qwindowsaudiodeviceinfo.cpp b/src/plugins/windowsaudio/qwindowsaudiodeviceinfo.cpp index c054c0f76..70e7fbce5 100644 --- a/src/plugins/windowsaudio/qwindowsaudiodeviceinfo.cpp +++ b/src/plugins/windowsaudio/qwindowsaudiodeviceinfo.cpp @@ -396,7 +396,7 @@ QList<QByteArray> QWindowsAudioDeviceInfo::availableDevices(QAudio::Mode mode) QList<QByteArray> devices; //enumerate device fullnames through directshow api - CoInitialize(NULL); + auto hrCoInit = CoInitialize(nullptr); ICreateDevEnum *pDevEnum = NULL; IEnumMoniker *pEnum = NULL; // Create the System device enumerator @@ -447,7 +447,8 @@ QList<QByteArray> QWindowsAudioDeviceInfo::availableDevices(QAudio::Mode mode) } pDevEnum->Release(); } - CoUninitialize(); + if (SUCCEEDED(hrCoInit)) + CoUninitialize(); return devices; } 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/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(); |