diff options
Diffstat (limited to 'src/plugins/directshow')
49 files changed, 872 insertions, 784 deletions
diff --git a/src/plugins/directshow/camera/camera.pri b/src/plugins/directshow/camera/camera.pri index 0e1c1e895..3be1acc49 100644 --- a/src/plugins/directshow/camera/camera.pri +++ b/src/plugins/directshow/camera/camera.pri @@ -15,7 +15,8 @@ HEADERS += \ $$PWD/directshowcameraexposurecontrol.h \ $$PWD/directshowcameracapturedestinationcontrol.h \ $$PWD/directshowcameracapturebufferformatcontrol.h \ - $$PWD/directshowcamerazoomcontrol.h + $$PWD/directshowcamerazoomcontrol.h \ + $$PWD/directshowcameraimageencodercontrol.h SOURCES += \ $$PWD/dscameraservice.cpp \ @@ -29,7 +30,8 @@ SOURCES += \ $$PWD/directshowcameraexposurecontrol.cpp \ $$PWD/directshowcameracapturedestinationcontrol.cpp \ $$PWD/directshowcameracapturebufferformatcontrol.cpp \ - $$PWD/directshowcamerazoomcontrol.cpp + $$PWD/directshowcamerazoomcontrol.cpp \ + $$PWD/directshowcameraimageencodercontrol.cpp *-msvc*:INCLUDEPATH += $$(DXSDK_DIR)/include QMAKE_USE += directshow diff --git a/src/plugins/directshow/camera/directshowcameraexposurecontrol.cpp b/src/plugins/directshow/camera/directshowcameraexposurecontrol.cpp index 7ece366ea..6f138450c 100644 --- a/src/plugins/directshow/camera/directshowcameraexposurecontrol.cpp +++ b/src/plugins/directshow/camera/directshowcameraexposurecontrol.cpp @@ -68,13 +68,16 @@ DirectShowCameraExposureControl::DirectShowCameraExposureControl(DSCameraSession bool DirectShowCameraExposureControl::isParameterSupported(QCameraExposureControl::ExposureParameter parameter) const { - if (parameter == ShutterSpeed) - return (m_shutterSpeedValues.caps & CameraControl_Flags_Manual); - if (parameter == Aperture) + switch (parameter) { + case QCameraExposureControl::Aperture: return (m_apertureValues.caps & CameraControl_Flags_Manual); - if (parameter == ExposureMode) + case QCameraExposureControl::ShutterSpeed: + return (m_shutterSpeedValues.caps & CameraControl_Flags_Manual); + case QCameraExposureControl::ExposureMode: return true; - + default: + break; + } return false; } @@ -156,10 +159,9 @@ bool DirectShowCameraExposureControl::setValue(QCameraExposureControl::ExposureP if (parameter == ShutterSpeed) { m_requestedShutterSpeed = newValue; return setShutterSpeed(cameraControl, m_requestedShutterSpeed); - } else { - m_requestedAperture = newValue; - return setAperture(cameraControl, m_requestedAperture); } + m_requestedAperture = newValue; + return setAperture(cameraControl, m_requestedAperture); } if (parameter == ExposureMode) { diff --git a/src/plugins/directshow/camera/directshowcameraimageencodercontrol.cpp b/src/plugins/directshow/camera/directshowcameraimageencodercontrol.cpp new file mode 100644 index 000000000..912f67a2d --- /dev/null +++ b/src/plugins/directshow/camera/directshowcameraimageencodercontrol.cpp @@ -0,0 +1,95 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "directshowcameraimageencodercontrol.h" +#include "dscamerasession.h" +#include <QImageWriter> + +QT_BEGIN_NAMESPACE + +DirectShowCameraImageEncoderControl::DirectShowCameraImageEncoderControl(DSCameraSession *session) + : QImageEncoderControl(session) + , m_session(session) +{ +} + +QList<QSize> DirectShowCameraImageEncoderControl::supportedResolutions(const QImageEncoderSettings &settings, bool *continuous) const +{ + QList<QSize> res; + if (!settings.codec().isEmpty() && !supportedImageCodecs().contains(settings.codec(), Qt::CaseInsensitive)) + return res; + + QList<QSize> resolutions = m_session->supportedResolutions(continuous); + QSize r = settings.resolution(); + if (!r.isValid()) + return resolutions; + + if (resolutions.contains(r)) + res << settings.resolution(); + + return res; +} + +QStringList DirectShowCameraImageEncoderControl::supportedImageCodecs() const +{ + QStringList supportedCodecs; + for (const QByteArray &type: QImageWriter::supportedImageFormats()) { + supportedCodecs << type; + } + + return supportedCodecs; +} + +QString DirectShowCameraImageEncoderControl::imageCodecDescription(const QString &codecName) const +{ + Q_UNUSED(codecName); + return QString(); +} + +QImageEncoderSettings DirectShowCameraImageEncoderControl::imageSettings() const +{ + return m_session->imageEncoderSettings(); +} + +void DirectShowCameraImageEncoderControl::setImageSettings(const QImageEncoderSettings &settings) +{ + m_session->setImageEncoderSettings(settings); +} + +QT_END_NAMESPACE diff --git a/src/plugins/directshow/camera/directshowcameraimageencodercontrol.h b/src/plugins/directshow/camera/directshowcameraimageencodercontrol.h new file mode 100644 index 000000000..6891bea77 --- /dev/null +++ b/src/plugins/directshow/camera/directshowcameraimageencodercontrol.h @@ -0,0 +1,70 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef DIRECTSHOWCAMERAIMAGEENCODERCONTROL_H +#define DIRECTSHOWCAMERAIMAGEENCODERCONTROL_H + +#include <qimageencodercontrol.h> + +QT_BEGIN_NAMESPACE + +class DSCameraSession; +class DirectShowCameraImageEncoderControl : public QImageEncoderControl +{ + Q_OBJECT +public: + DirectShowCameraImageEncoderControl(DSCameraSession *session); + + QList<QSize> supportedResolutions( + const QImageEncoderSettings &settings = QImageEncoderSettings(), + bool *continuous = nullptr) const override; + + QStringList supportedImageCodecs() const override; + QString imageCodecDescription(const QString &formatName) const override; + + QImageEncoderSettings imageSettings() const override; + void setImageSettings(const QImageEncoderSettings &settings) override; + +private: + DSCameraSession *m_session; +}; + +QT_END_NAMESPACE + +#endif // DIRECTSHOWCAMERAIMAGEENCODERCONTROL_H diff --git a/src/plugins/directshow/camera/dscameracontrol.cpp b/src/plugins/directshow/camera/dscameracontrol.cpp index daf104e1c..67971d1b5 100644 --- a/src/plugins/directshow/camera/dscameracontrol.cpp +++ b/src/plugins/directshow/camera/dscameracontrol.cpp @@ -61,9 +61,7 @@ DSCameraControl::DSCameraControl(QObject *parent) this, &DSCameraControl::error); } -DSCameraControl::~DSCameraControl() -{ -} +DSCameraControl::~DSCameraControl() = default; void DSCameraControl::setState(QCamera::State state) { diff --git a/src/plugins/directshow/camera/dscameracontrol.h b/src/plugins/directshow/camera/dscameracontrol.h index 2f50db560..b9fb2766d 100644 --- a/src/plugins/directshow/camera/dscameracontrol.h +++ b/src/plugins/directshow/camera/dscameracontrol.h @@ -45,7 +45,6 @@ QT_BEGIN_NAMESPACE -class DSCameraService; class DSCameraSession; @@ -54,22 +53,22 @@ class DSCameraControl : public QCameraControl Q_OBJECT public: DSCameraControl(QObject *parent = 0); - ~DSCameraControl(); + ~DSCameraControl() override; - QCamera::State state() const { return m_state; } + QCamera::State state() const override { return m_state; } - QCamera::CaptureModes captureMode() const { return m_captureMode; } - void setCaptureMode(QCamera::CaptureModes mode); + QCamera::CaptureModes captureMode() const override { return m_captureMode; } + void setCaptureMode(QCamera::CaptureModes mode) override; - void setState(QCamera::State state); + void setState(QCamera::State state) override; - QCamera::Status status() const; - bool isCaptureModeSupported(QCamera::CaptureModes mode) const; - bool canChangeProperty(PropertyChangeType /* changeType */, QCamera::Status /* status */) const {return false; } + QCamera::Status status() const override; + bool isCaptureModeSupported(QCamera::CaptureModes mode) const override; + bool canChangeProperty(PropertyChangeType, QCamera::Status) const override + { return false; } private: DSCameraSession *m_session; - DSCameraService *m_service; QCamera::State m_state; QCamera::CaptureModes m_captureMode; }; diff --git a/src/plugins/directshow/camera/dscameraimageprocessingcontrol.cpp b/src/plugins/directshow/camera/dscameraimageprocessingcontrol.cpp index cbecb8b86..6d0f45ae9 100644 --- a/src/plugins/directshow/camera/dscameraimageprocessingcontrol.cpp +++ b/src/plugins/directshow/camera/dscameraimageprocessingcontrol.cpp @@ -48,9 +48,7 @@ DSCameraImageProcessingControl::DSCameraImageProcessingControl(DSCameraSession * { } -DSCameraImageProcessingControl::~DSCameraImageProcessingControl() -{ -} +DSCameraImageProcessingControl::~DSCameraImageProcessingControl() = default; bool DSCameraImageProcessingControl::isParameterSupported( QCameraImageProcessingControl::ProcessingParameter parameter) const diff --git a/src/plugins/directshow/camera/dscameraimageprocessingcontrol.h b/src/plugins/directshow/camera/dscameraimageprocessingcontrol.h index 86ecce720..48f1b6b2c 100644 --- a/src/plugins/directshow/camera/dscameraimageprocessingcontrol.h +++ b/src/plugins/directshow/camera/dscameraimageprocessingcontrol.h @@ -53,12 +53,13 @@ class DSCameraImageProcessingControl : public QCameraImageProcessingControl public: DSCameraImageProcessingControl(DSCameraSession *session); - virtual ~DSCameraImageProcessingControl(); + ~DSCameraImageProcessingControl() override; - bool isParameterSupported(ProcessingParameter) const; - bool isParameterValueSupported(ProcessingParameter parameter, const QVariant &value) const; - QVariant parameter(ProcessingParameter parameter) const; - void setParameter(ProcessingParameter parameter, const QVariant &value); + bool isParameterSupported(ProcessingParameter) const override; + bool isParameterValueSupported(ProcessingParameter parameter, + const QVariant &value) const override; + QVariant parameter(ProcessingParameter parameter) const override; + void setParameter(ProcessingParameter parameter, const QVariant &value) override; private: DSCameraSession *m_session; diff --git a/src/plugins/directshow/camera/dscameraservice.cpp b/src/plugins/directshow/camera/dscameraservice.cpp index a806cabe3..8115ef385 100644 --- a/src/plugins/directshow/camera/dscameraservice.cpp +++ b/src/plugins/directshow/camera/dscameraservice.cpp @@ -53,6 +53,7 @@ #include "directshowcameracapturebufferformatcontrol.h" #include "directshowvideoprobecontrol.h" #include "directshowcamerazoomcontrol.h" +#include "directshowcameraimageencodercontrol.h" QT_BEGIN_NAMESPACE @@ -70,6 +71,7 @@ DSCameraService::DSCameraService(QObject *parent): , m_captureBufferFormatControl(new DirectShowCameraCaptureBufferFormatControl) , m_videoProbeControl(nullptr) , m_zoomControl(new DirectShowCameraZoomControl(m_session)) + , m_imageEncoderControl(new DirectShowCameraImageEncoderControl(m_session)) { } @@ -81,6 +83,7 @@ DSCameraService::~DSCameraService() delete m_videoDevice; delete m_videoRenderer; delete m_imageCapture; + delete m_imageEncoderControl; delete m_session; delete m_exposureControl; delete m_captureDestinationControl; @@ -134,6 +137,9 @@ QMediaControl* DSCameraService::requestControl(const char *name) if (qstrcmp(name, QCameraZoomControl_iid) == 0) return m_zoomControl; + if (qstrcmp(name, QImageEncoderControl_iid) == 0) + return m_imageEncoderControl; + return 0; } diff --git a/src/plugins/directshow/camera/dscameraservice.h b/src/plugins/directshow/camera/dscameraservice.h index f444eeb51..9a8f745f6 100644 --- a/src/plugins/directshow/camera/dscameraservice.h +++ b/src/plugins/directshow/camera/dscameraservice.h @@ -57,6 +57,7 @@ class DirectShowCameraCaptureDestinationControl; class DirectShowCameraCaptureBufferFormatControl; class DirectShowVideoProbeControl; class DirectShowCameraZoomControl; +class DirectShowCameraImageEncoderControl; class DSCameraService : public QMediaService { @@ -64,10 +65,10 @@ class DSCameraService : public QMediaService public: DSCameraService(QObject *parent = 0); - ~DSCameraService(); + ~DSCameraService() override; - virtual QMediaControl* requestControl(const char *name); - virtual void releaseControl(QMediaControl *control); + QMediaControl* requestControl(const char *name) override; + void releaseControl(QMediaControl *control) override; private: DSCameraSession *m_session; @@ -82,6 +83,7 @@ private: DirectShowCameraCaptureBufferFormatControl *m_captureBufferFormatControl; DirectShowVideoProbeControl *m_videoProbeControl; DirectShowCameraZoomControl *m_zoomControl; + DirectShowCameraImageEncoderControl *m_imageEncoderControl; }; QT_END_NAMESPACE diff --git a/src/plugins/directshow/camera/dscamerasession.cpp b/src/plugins/directshow/camera/dscamerasession.cpp index c309359ed..8d0c72057 100644 --- a/src/plugins/directshow/camera/dscamerasession.cpp +++ b/src/plugins/directshow/camera/dscamerasession.cpp @@ -130,30 +130,28 @@ void DSCameraSession::setViewfinderSettings(const QCameraViewfinderSettings &set qreal DSCameraSession::scaledImageProcessingParameterValue( const ImageProcessingParameterInfo &sourceValueInfo) { - if (sourceValueInfo.currentValue == sourceValueInfo.defaultValue) { + if (sourceValueInfo.currentValue == sourceValueInfo.defaultValue) return 0.0f; - } else if (sourceValueInfo.currentValue < sourceValueInfo.defaultValue) { + if (sourceValueInfo.currentValue < sourceValueInfo.defaultValue) { return ((sourceValueInfo.currentValue - sourceValueInfo.minimumValue) / qreal(sourceValueInfo.defaultValue - sourceValueInfo.minimumValue)) + (-1.0f); - } else { - return ((sourceValueInfo.currentValue - sourceValueInfo.defaultValue) - / qreal(sourceValueInfo.maximumValue - sourceValueInfo.defaultValue)); } + return ((sourceValueInfo.currentValue - sourceValueInfo.defaultValue) + / qreal(sourceValueInfo.maximumValue - sourceValueInfo.defaultValue)); } qint32 DSCameraSession::sourceImageProcessingParameterValue( qreal scaledValue, const ImageProcessingParameterInfo &valueRange) { - if (qFuzzyIsNull(scaledValue)) { + if (qFuzzyIsNull(scaledValue)) return valueRange.defaultValue; - } else if (scaledValue < 0.0f) { + if (scaledValue < 0.0f) { return ((scaledValue - (-1.0f)) * (valueRange.defaultValue - valueRange.minimumValue)) + valueRange.minimumValue; - } else { - return (scaledValue * (valueRange.maximumValue - valueRange.defaultValue)) - + valueRange.defaultValue; } + return (scaledValue * (valueRange.maximumValue - valueRange.defaultValue)) + + valueRange.defaultValue; } static QCameraImageProcessingControl::ProcessingParameter searchRelatedResultingParameter( @@ -482,7 +480,7 @@ bool DSCameraSession::startPreview() if (m_surface) m_surface->start(m_previewSurfaceFormat); - hr = m_filterGraph->QueryInterface(IID_IMediaControl, (void**)&pControl); + hr = m_filterGraph->QueryInterface(IID_IMediaControl, reinterpret_cast<void**>(&pControl)); if (FAILED(hr)) { errorString = tr("Failed to get stream control"); goto failed; @@ -520,7 +518,8 @@ bool DSCameraSession::stopPreview() QString errorString; IMediaControl* pControl = 0; - HRESULT hr = m_filterGraph->QueryInterface(IID_IMediaControl, (void**)&pControl); + HRESULT hr = m_filterGraph->QueryInterface(IID_IMediaControl, + reinterpret_cast<void**>(&pControl)); if (FAILED(hr)) { errorString = tr("Failed to get stream control"); goto failed; @@ -585,10 +584,13 @@ int DSCameraSession::captureImage(const QString &fileName) return m_imageIdCounter; } + const QString ext = !m_imageEncoderSettings.codec().isEmpty() + ? m_imageEncoderSettings.codec().toLower() + : QLatin1String("jpg"); m_imageCaptureFileName = m_fileNameGenerator.generateFileName(fileName, QMediaStorageLocation::Pictures, QLatin1String("IMG_"), - QLatin1String("jpg")); + ext); updateReadyForCapture(); @@ -688,8 +690,9 @@ void DSCameraSession::processCapturedImage(int id, const QImage &image, const QString &path) { + const QString format = m_imageEncoderSettings.codec(); if (captureDestinations & QCameraImageCapture::CaptureToFile) { - if (image.save(path, "JPG")) { + if (image.save(path, !format.isEmpty() ? format.toUtf8().constData() : "JPG")) { Q_EMIT imageSaved(id, path); } else { Q_EMIT captureError(id, QCameraImageCapture::ResourceError, @@ -714,7 +717,7 @@ bool DSCameraSession::createFilterGraph() // Create the filter graph hr = CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC, - IID_IGraphBuilder, (void**)&m_filterGraph); + IID_IGraphBuilder, reinterpret_cast<void**>(&m_filterGraph)); if (FAILED(hr)) { errorString = tr("Failed to create filter graph"); goto failed; @@ -722,7 +725,8 @@ bool DSCameraSession::createFilterGraph() // Create the capture graph builder hr = CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC, - IID_ICaptureGraphBuilder2, (void**)&m_graphBuilder); + IID_ICaptureGraphBuilder2, + reinterpret_cast<void**>(&m_graphBuilder)); if (FAILED(hr)) { errorString = tr("Failed to create graph builder"); goto failed; @@ -756,7 +760,8 @@ bool DSCameraSession::createFilterGraph() QString output = QString::fromWCharArray(strName); mallocInterface->Free(strName); if (m_sourceDeviceName.contains(output)) { - hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&m_sourceFilter); + hr = pMoniker->BindToObject(nullptr, nullptr, IID_IBaseFilter, + reinterpret_cast<void**>(&m_sourceFilter)); if (SUCCEEDED(hr)) { pMoniker->Release(); break; @@ -775,7 +780,8 @@ bool DSCameraSession::createFilterGraph() while (pEnum->Next(1, &pMoniker, NULL) == S_OK) { IPropertyBag *pPropBag = 0; - hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag, (void**)(&pPropBag)); + hr = pMoniker->BindToStorage(nullptr, nullptr, IID_IPropertyBag, + reinterpret_cast<void**>(&pPropBag)); if (FAILED(hr)) { pMoniker->Release(); continue; // Don't panic yet @@ -783,7 +789,8 @@ bool DSCameraSession::createFilterGraph() // No need to get the description, just grab it - hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&m_sourceFilter); + hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, + reinterpret_cast<void**>(&m_sourceFilter)); pPropBag->Release(); pMoniker->Release(); if (SUCCEEDED(hr)) { @@ -841,9 +848,11 @@ bool DSCameraSession::configurePreviewFormat() { // Resolve viewfinder settings int settingsIndex = 0; + const QSize captureResolution = m_imageEncoderSettings.resolution(); + const QSize resolution = captureResolution.isValid() ? captureResolution : m_viewfinderSettings.resolution(); QCameraViewfinderSettings resolvedViewfinderSettings; for (const QCameraViewfinderSettings &s : qAsConst(m_supportedViewfinderSettings)) { - if ((m_viewfinderSettings.resolution().isEmpty() || m_viewfinderSettings.resolution() == s.resolution()) + if ((resolution.isEmpty() || resolution == s.resolution()) && (qFuzzyIsNull(m_viewfinderSettings.minimumFrameRate()) || qFuzzyCompare((float)m_viewfinderSettings.minimumFrameRate(), (float)s.minimumFrameRate())) && (qFuzzyIsNull(m_viewfinderSettings.maximumFrameRate()) || qFuzzyCompare((float)m_viewfinderSettings.maximumFrameRate(), (float)s.maximumFrameRate())) && (m_viewfinderSettings.pixelFormat() == QVideoFrame::Format_Invalid || m_viewfinderSettings.pixelFormat() == s.pixelFormat()) @@ -887,10 +896,9 @@ bool DSCameraSession::configurePreviewFormat() HRESULT hr; IAMStreamConfig* pConfig = 0; - hr = m_graphBuilder->FindInterface(&PIN_CATEGORY_CAPTURE, - &MEDIATYPE_Video, - m_sourceFilter, - IID_IAMStreamConfig, (void**)&pConfig); + hr = m_graphBuilder->FindInterface(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, + m_sourceFilter, IID_IAMStreamConfig, + reinterpret_cast<void**>(&pConfig)); if (FAILED(hr)) { qWarning() << "Failed to get config for capture device"; return false; @@ -1064,8 +1072,8 @@ void DSCameraSession::updateSourceCapabilities() IAMVideoControl *pVideoControl = 0; hr = m_graphBuilder->FindInterface(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, - m_sourceFilter, - IID_IAMVideoControl, (void**)&pVideoControl); + m_sourceFilter, IID_IAMVideoControl, + reinterpret_cast<void**>(&pVideoControl)); if (FAILED(hr)) { qWarning() << "Failed to get the video control"; } else { @@ -1091,8 +1099,8 @@ void DSCameraSession::updateSourceCapabilities() } hr = m_graphBuilder->FindInterface(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, - m_sourceFilter, - IID_IAMStreamConfig, (void**)&pConfig); + m_sourceFilter, IID_IAMStreamConfig, + reinterpret_cast<void**>(&pConfig)); if (FAILED(hr)) { qWarning() << "failed to get config on capture device"; return; @@ -1169,4 +1177,23 @@ void DSCameraSession::updateSourceCapabilities() updateImageProcessingParametersInfos(); } +QList<QSize> DSCameraSession::supportedResolutions(bool *continuous) const +{ + if (continuous) + *continuous = false; + + QList<QSize> res; + for (auto &settings : m_supportedViewfinderSettings) { + auto size = settings.resolution(); + if (!res.contains(size)) + res << size; + } + + std::sort(res.begin(), res.end(), [](const QSize &r1, const QSize &r2) { + return qlonglong(r1.width()) * r1.height() < qlonglong(r2.width()) * r2.height(); + }); + + return res; +} + QT_END_NAMESPACE diff --git a/src/plugins/directshow/camera/dscamerasession.h b/src/plugins/directshow/camera/dscamerasession.h index 433db8994..361a0220e 100644 --- a/src/plugins/directshow/camera/dscamerasession.h +++ b/src/plugins/directshow/camera/dscamerasession.h @@ -51,6 +51,7 @@ #include <QtMultimedia/qvideosurfaceformat.h> #include <QtMultimedia/qcameraimageprocessingcontrol.h> #include <QtMultimedia/qcameraimagecapture.h> +#include <QtMultimedia/qmediaencodersettings.h> #include <private/qmediastoragelocation_p.h> #include <tchar.h> @@ -84,7 +85,7 @@ class DSCameraSession : public QObject Q_OBJECT public: DSCameraSession(QObject *parent = 0); - ~DSCameraSession(); + ~DSCameraSession() override; QCamera::Status status() const { return m_status; } @@ -129,6 +130,11 @@ public: void addVideoProbe(DirectShowVideoProbeControl *probe); void removeVideoProbe(DirectShowVideoProbeControl *probe); + QList<QSize> supportedResolutions(bool *continuous) const; + QImageEncoderSettings imageEncoderSettings() const { return m_imageEncoderSettings; } + void setImageEncoderSettings(const QImageEncoderSettings &settings) + { m_imageEncoderSettings = settings; } + Q_SIGNALS: void statusChanged(QCamera::Status); void imageExposed(int id); @@ -145,25 +151,15 @@ private Q_SLOTS: void updateReadyForCapture(); private: - struct ImageProcessingParameterInfo { - ImageProcessingParameterInfo() - : minimumValue(0) - , maximumValue(0) - , defaultValue(0) - , currentValue(0) - , capsFlags(0) - , hasBeenExplicitlySet(false) - , videoProcAmpProperty(VideoProcAmp_Brightness) - { - } - - LONG minimumValue; - LONG maximumValue; - LONG defaultValue; - LONG currentValue; - LONG capsFlags; - bool hasBeenExplicitlySet; - VideoProcAmpProperty videoProcAmpProperty; + struct ImageProcessingParameterInfo + { + LONG minimumValue = 0; + LONG maximumValue = 0; + LONG defaultValue = 0; + LONG currentValue = 0; + LONG capsFlags = 0; + bool hasBeenExplicitlySet = false; + VideoProcAmpProperty videoProcAmpProperty = VideoProcAmp_Brightness; }; void setStatus(QCamera::Status status); @@ -227,6 +223,8 @@ private: QMutex m_probeMutex; DirectShowVideoProbeControl *m_videoProbeControl; + QImageEncoderSettings m_imageEncoderSettings; + // Internal state QCamera::Status m_status; QTimer m_deviceLostEventTimer; diff --git a/src/plugins/directshow/camera/dscameraviewfindersettingscontrol.h b/src/plugins/directshow/camera/dscameraviewfindersettingscontrol.h index 5ab3c2d93..a2b646edf 100644 --- a/src/plugins/directshow/camera/dscameraviewfindersettingscontrol.h +++ b/src/plugins/directshow/camera/dscameraviewfindersettingscontrol.h @@ -51,10 +51,10 @@ class DSCameraViewfinderSettingsControl : public QCameraViewfinderSettingsContro public: DSCameraViewfinderSettingsControl(DSCameraSession *session); - QList<QCameraViewfinderSettings> supportedViewfinderSettings() const; + QList<QCameraViewfinderSettings> supportedViewfinderSettings() const override; - QCameraViewfinderSettings viewfinderSettings() const; - void setViewfinderSettings(const QCameraViewfinderSettings &settings); + QCameraViewfinderSettings viewfinderSettings() const override; + void setViewfinderSettings(const QCameraViewfinderSettings &settings) override; private: DSCameraSession *m_session; diff --git a/src/plugins/directshow/camera/dsimagecapturecontrol.cpp b/src/plugins/directshow/camera/dsimagecapturecontrol.cpp index c92ce98e1..2a6a794d5 100644 --- a/src/plugins/directshow/camera/dsimagecapturecontrol.cpp +++ b/src/plugins/directshow/camera/dsimagecapturecontrol.cpp @@ -61,9 +61,7 @@ DSImageCaptureControl::DSImageCaptureControl(DSCameraSession *session) this, &DSImageCaptureControl::imageAvailable); } -DSImageCaptureControl::~DSImageCaptureControl() -{ -} +DSImageCaptureControl::~DSImageCaptureControl() = default; bool DSImageCaptureControl::isReadyForCapture() const { diff --git a/src/plugins/directshow/camera/dsimagecapturecontrol.h b/src/plugins/directshow/camera/dsimagecapturecontrol.h index 38b832dc4..c619de1a1 100644 --- a/src/plugins/directshow/camera/dsimagecapturecontrol.h +++ b/src/plugins/directshow/camera/dsimagecapturecontrol.h @@ -50,15 +50,15 @@ class DSImageCaptureControl : public QCameraImageCaptureControl Q_OBJECT public: DSImageCaptureControl(DSCameraSession *session); - ~DSImageCaptureControl(); + ~DSImageCaptureControl() override; - bool isReadyForCapture() const; - int capture(const QString &fileName); + bool isReadyForCapture() const override; + int capture(const QString &fileName) override; - QCameraImageCapture::DriveMode driveMode() const; - void setDriveMode(QCameraImageCapture::DriveMode mode); + QCameraImageCapture::DriveMode driveMode() const override; + void setDriveMode(QCameraImageCapture::DriveMode mode) override; - void cancelCapture() {} + void cancelCapture() override {} private: DSCameraSession *m_session; diff --git a/src/plugins/directshow/camera/dsvideodevicecontrol.cpp b/src/plugins/directshow/camera/dsvideodevicecontrol.cpp index 26410fc3a..2c1fab764 100644 --- a/src/plugins/directshow/camera/dsvideodevicecontrol.cpp +++ b/src/plugins/directshow/camera/dsvideodevicecontrol.cpp @@ -156,7 +156,8 @@ void DSVideoDeviceControl::updateDevices() devInfo.first = output.toUtf8(); IPropertyBag *pPropBag; - hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag, (void**)(&pPropBag)); + hr = pMoniker->BindToStorage(nullptr, nullptr, IID_IPropertyBag, + reinterpret_cast<void**>(&pPropBag)); if (SUCCEEDED(hr)) { // Find the description VARIANT varName; diff --git a/src/plugins/directshow/camera/dsvideodevicecontrol.h b/src/plugins/directshow/camera/dsvideodevicecontrol.h index 09f46aff0..7a7a0af1e 100644 --- a/src/plugins/directshow/camera/dsvideodevicecontrol.h +++ b/src/plugins/directshow/camera/dsvideodevicecontrol.h @@ -56,16 +56,16 @@ class DSVideoDeviceControl : public QVideoDeviceSelectorControl public: DSVideoDeviceControl(QObject *parent = 0); - int deviceCount() const; - QString deviceName(int index) const; - QString deviceDescription(int index) const; - int defaultDevice() const; - int selectedDevice() const; + int deviceCount() const override; + QString deviceName(int index) const override; + QString deviceDescription(int index) const override; + int defaultDevice() const override; + int selectedDevice() const override; static const QList<DSVideoDeviceInfo> &availableDevices(); public Q_SLOTS: - void setSelectedDevice(int index); + void setSelectedDevice(int index) override; private: static void updateDevices(); diff --git a/src/plugins/directshow/camera/dsvideorenderer.cpp b/src/plugins/directshow/camera/dsvideorenderer.cpp index 4eacb5456..bf0aa2684 100644 --- a/src/plugins/directshow/camera/dsvideorenderer.cpp +++ b/src/plugins/directshow/camera/dsvideorenderer.cpp @@ -50,9 +50,7 @@ DSVideoRendererControl::DSVideoRendererControl(DSCameraSession* session, QObject { } -DSVideoRendererControl::~DSVideoRendererControl() -{ -} +DSVideoRendererControl::~DSVideoRendererControl() = default; QAbstractVideoSurface* DSVideoRendererControl::surface() const { diff --git a/src/plugins/directshow/camera/dsvideorenderer.h b/src/plugins/directshow/camera/dsvideorenderer.h index 7618f0ca6..3a4570b4c 100644 --- a/src/plugins/directshow/camera/dsvideorenderer.h +++ b/src/plugins/directshow/camera/dsvideorenderer.h @@ -43,8 +43,6 @@ #include <qvideorenderercontrol.h> #include "dscamerasession.h" -class CameraFormatConverter; - QT_BEGIN_NAMESPACE @@ -53,17 +51,16 @@ class DSVideoRendererControl : public QVideoRendererControl Q_OBJECT public: DSVideoRendererControl(DSCameraSession* session, QObject *parent = 0); - ~DSVideoRendererControl(); + ~DSVideoRendererControl() override; - QAbstractVideoSurface *surface() const; - void setSurface(QAbstractVideoSurface *surface); + QAbstractVideoSurface *surface() const override; + void setSurface(QAbstractVideoSurface *surface) override; void setSession(DSCameraSession* session); private: QAbstractVideoSurface* m_surface; DSCameraSession* m_session; - CameraFormatConverter* converter; }; QT_END_NAMESPACE diff --git a/src/plugins/directshow/common/directshowaudioprobecontrol.h b/src/plugins/directshow/common/directshowaudioprobecontrol.h index 553bd1178..034e958fd 100644 --- a/src/plugins/directshow/common/directshowaudioprobecontrol.h +++ b/src/plugins/directshow/common/directshowaudioprobecontrol.h @@ -51,7 +51,7 @@ class DirectShowAudioProbeControl : public QMediaAudioProbeControl Q_OBJECT public: explicit DirectShowAudioProbeControl(QObject *p = nullptr); - ~DirectShowAudioProbeControl(); + ~DirectShowAudioProbeControl() override; bool ref() { return m_ref.ref(); } bool deref() { return m_ref.deref(); } diff --git a/src/plugins/directshow/common/directshowbasefilter.cpp b/src/plugins/directshow/common/directshowbasefilter.cpp index 1e45eea51..2792dc3c6 100644 --- a/src/plugins/directshow/common/directshowbasefilter.cpp +++ b/src/plugins/directshow/common/directshowbasefilter.cpp @@ -172,51 +172,43 @@ HRESULT DirectShowBaseFilter::SetSyncSource(IReferenceClock *pClock) HRESULT DirectShowBaseFilter::GetSyncSource(IReferenceClock **ppClock) { - if (!ppClock) { + if (!ppClock) return E_POINTER; - } else { - if (!m_clock) { - *ppClock = 0; - - return S_FALSE; - } else { - m_clock->AddRef(); - *ppClock = m_clock; - - return S_OK; - } + if (!m_clock) { + *ppClock = nullptr; + return S_FALSE; } + m_clock->AddRef(); + *ppClock = m_clock; + return S_OK; } HRESULT DirectShowBaseFilter::EnumPins(IEnumPins **ppEnum) { - if (!ppEnum) { + if (!ppEnum) return E_POINTER; - } else { - *ppEnum = new DirectShowPinEnum(this); - return S_OK; - } + *ppEnum = new DirectShowPinEnum(this); + return S_OK; } HRESULT DirectShowBaseFilter::FindPin(LPCWSTR Id, IPin **ppPin) { - if (!ppPin || !Id) { + if (!ppPin || !Id) return E_POINTER; - } else { - QMutexLocker locker(&m_mutex); - const QList<DirectShowPin *> pinList = pins(); - for (DirectShowPin *pin : pinList) { - if (QString::fromWCharArray(Id) == pin->name()) { - pin->AddRef(); - *ppPin = pin; - return S_OK; - } - } - *ppPin = 0; - return VFW_E_NOT_FOUND; + QMutexLocker locker(&m_mutex); + const QList<DirectShowPin *> pinList = pins(); + for (DirectShowPin *pin : pinList) { + if (pin->name() == QStringView(Id)) { + pin->AddRef(); + *ppPin = pin; + return S_OK; + } } + + *ppPin = 0; + return VFW_E_NOT_FOUND; } HRESULT DirectShowBaseFilter::JoinFilterGraph(IFilterGraph *pGraph, LPCWSTR pName) @@ -237,24 +229,23 @@ HRESULT DirectShowBaseFilter::JoinFilterGraph(IFilterGraph *pGraph, LPCWSTR pNam HRESULT DirectShowBaseFilter::QueryFilterInfo(FILTER_INFO *pInfo) { - if (!pInfo) { + if (!pInfo) return E_POINTER; - } else { - QString name = m_filterName; - if (name.length() >= MAX_FILTER_NAME) - name.truncate(MAX_FILTER_NAME - 1); + QString name = m_filterName; - int length = name.toWCharArray(pInfo->achName); - pInfo->achName[length] = '\0'; + if (name.length() >= MAX_FILTER_NAME) + name.truncate(MAX_FILTER_NAME - 1); - if (m_graph) - m_graph->AddRef(); + int length = name.toWCharArray(pInfo->achName); + pInfo->achName[length] = '\0'; - pInfo->pGraph = m_graph; + if (m_graph) + m_graph->AddRef(); - return S_OK; - } + pInfo->pGraph = m_graph; + + return S_OK; } HRESULT DirectShowBaseFilter::QueryVendorInfo(LPWSTR *pVendorInfo) diff --git a/src/plugins/directshow/common/directshowbasefilter.h b/src/plugins/directshow/common/directshowbasefilter.h index 21ca648eb..fe78f96b2 100644 --- a/src/plugins/directshow/common/directshowbasefilter.h +++ b/src/plugins/directshow/common/directshowbasefilter.h @@ -48,7 +48,7 @@ class DirectShowBaseFilter : public IBaseFilter { public: DirectShowBaseFilter(); - ~DirectShowBaseFilter(); + virtual ~DirectShowBaseFilter(); FILTER_STATE state() const { return m_state; } HRESULT NotifyEvent(long eventCode, LONG_PTR eventParam1, LONG_PTR eventParam2); @@ -56,26 +56,26 @@ public: virtual QList<DirectShowPin *> pins() = 0; // IPersist - STDMETHODIMP GetClassID(CLSID *pClassID); + STDMETHODIMP GetClassID(CLSID *pClassID) override; // IMediaFilter - STDMETHODIMP Run(REFERENCE_TIME tStart); - STDMETHODIMP Pause(); - STDMETHODIMP Stop(); + STDMETHODIMP Run(REFERENCE_TIME tStart) override; + STDMETHODIMP Pause() override; + STDMETHODIMP Stop() override; - STDMETHODIMP GetState(DWORD dwMilliSecsTimeout, FILTER_STATE *pState); + STDMETHODIMP GetState(DWORD dwMilliSecsTimeout, FILTER_STATE *pState) override; - STDMETHODIMP SetSyncSource(IReferenceClock *pClock); - STDMETHODIMP GetSyncSource(IReferenceClock **ppClock); + STDMETHODIMP SetSyncSource(IReferenceClock *pClock) override; + STDMETHODIMP GetSyncSource(IReferenceClock **ppClock) override; // IBaseFilter - STDMETHODIMP EnumPins(IEnumPins **ppEnum); - STDMETHODIMP FindPin(LPCWSTR Id, IPin **ppPin); + STDMETHODIMP EnumPins(IEnumPins **ppEnum) override; + STDMETHODIMP FindPin(LPCWSTR Id, IPin **ppPin) override; - STDMETHODIMP JoinFilterGraph(IFilterGraph *pGraph, LPCWSTR pName); + STDMETHODIMP JoinFilterGraph(IFilterGraph *pGraph, LPCWSTR pName) override; - STDMETHODIMP QueryFilterInfo(FILTER_INFO *pInfo); - STDMETHODIMP QueryVendorInfo(LPWSTR *pVendorInfo); + STDMETHODIMP QueryFilterInfo(FILTER_INFO *pInfo) override; + STDMETHODIMP QueryVendorInfo(LPWSTR *pVendorInfo) override; protected: QMutex m_mutex; diff --git a/src/plugins/directshow/common/directshoweventloop.cpp b/src/plugins/directshow/common/directshoweventloop.cpp index ef85c0429..fbc7b8cee 100644 --- a/src/plugins/directshow/common/directshoweventloop.cpp +++ b/src/plugins/directshow/common/directshoweventloop.cpp @@ -46,6 +46,7 @@ QT_BEGIN_NAMESPACE class DirectShowPostedEvent { + Q_DISABLE_COPY(DirectShowPostedEvent) public: DirectShowPostedEvent(QObject *receiver, QEvent *event) : receiver(receiver) diff --git a/src/plugins/directshow/common/directshoweventloop.h b/src/plugins/directshow/common/directshoweventloop.h index 609e53134..a29274b7b 100644 --- a/src/plugins/directshow/common/directshoweventloop.h +++ b/src/plugins/directshow/common/directshoweventloop.h @@ -55,7 +55,7 @@ class DirectShowEventLoop : public QObject Q_OBJECT public: DirectShowEventLoop(QObject *parent = 0); - ~DirectShowEventLoop(); + ~DirectShowEventLoop() override; void wait(QMutex *mutex); void wake(); @@ -63,7 +63,7 @@ public: void postEvent(QObject *object, QEvent *event); protected: - void customEvent(QEvent *event); + void customEvent(QEvent *event) override; private: void processEvents(); diff --git a/src/plugins/directshow/common/directshowmediatype.cpp b/src/plugins/directshow/common/directshowmediatype.cpp index 65882806c..fe86e0204 100644 --- a/src/plugins/directshow/common/directshowmediatype.cpp +++ b/src/plugins/directshow/common/directshowmediatype.cpp @@ -98,7 +98,7 @@ DirectShowMediaType::DirectShowMediaType(const DirectShowMediaType &other) copy(&mediaType, &other.mediaType); } -DirectShowMediaType::DirectShowMediaType(DirectShowMediaType &&other) +DirectShowMediaType::DirectShowMediaType(DirectShowMediaType &&other) noexcept : DirectShowMediaType() { move(&mediaType, other.mediaType); @@ -110,7 +110,7 @@ DirectShowMediaType &DirectShowMediaType::operator=(const DirectShowMediaType &o return *this; } -DirectShowMediaType &DirectShowMediaType::operator=(DirectShowMediaType &&other) +DirectShowMediaType &DirectShowMediaType::operator=(DirectShowMediaType &&other) noexcept { move(&mediaType, other.mediaType); return *this; @@ -222,11 +222,10 @@ void DirectShowMediaType::clear(AM_MEDIA_TYPE &type) GUID DirectShowMediaType::convertPixelFormat(QVideoFrame::PixelFormat format) { - const int count = sizeof(qt_typeLookup) / sizeof(TypeLookup); - - for (int i = 0; i < count; ++i) - if (qt_typeLookup[i].pixelFormat == format) - return qt_typeLookup[i].mediaType; + for (const auto &lookupType : qt_typeLookup) { + if (lookupType.pixelFormat == format) + return lookupType.mediaType; + } return MEDIASUBTYPE_None; } @@ -236,16 +235,14 @@ QVideoSurfaceFormat DirectShowMediaType::videoFormatFromType(const AM_MEDIA_TYPE if (!type) return QVideoSurfaceFormat(); - const int count = sizeof(qt_typeLookup) / sizeof(TypeLookup); - - for (int i = 0; i < count; ++i) { - if (IsEqualGUID(qt_typeLookup[i].mediaType, type->subtype) && type->cbFormat > 0) { + for (const auto &lookupType : qt_typeLookup) { + if (IsEqualGUID(lookupType.mediaType, type->subtype) && type->cbFormat > 0) { if (IsEqualGUID(type->formattype, FORMAT_VideoInfo)) { VIDEOINFOHEADER *header = reinterpret_cast<VIDEOINFOHEADER *>(type->pbFormat); QVideoSurfaceFormat format( QSize(header->bmiHeader.biWidth, qAbs(header->bmiHeader.biHeight)), - qt_typeLookup[i].pixelFormat); + lookupType.pixelFormat); if (header->AvgTimePerFrame > 0) format.setFrameRate(10000 /header->AvgTimePerFrame); @@ -253,12 +250,13 @@ QVideoSurfaceFormat DirectShowMediaType::videoFormatFromType(const AM_MEDIA_TYPE format.setScanLineDirection(scanLineDirection(format.pixelFormat(), header->bmiHeader)); return format; - } else if (IsEqualGUID(type->formattype, FORMAT_VideoInfo2)) { + } + if (IsEqualGUID(type->formattype, FORMAT_VideoInfo2)) { VIDEOINFOHEADER2 *header = reinterpret_cast<VIDEOINFOHEADER2 *>(type->pbFormat); QVideoSurfaceFormat format( QSize(header->bmiHeader.biWidth, qAbs(header->bmiHeader.biHeight)), - qt_typeLookup[i].pixelFormat); + lookupType.pixelFormat); if (header->AvgTimePerFrame > 0) format.setFrameRate(10000 / header->AvgTimePerFrame); @@ -277,12 +275,9 @@ QVideoFrame::PixelFormat DirectShowMediaType::pixelFormatFromType(const AM_MEDIA if (!type) return QVideoFrame::Format_Invalid; - const int count = sizeof(qt_typeLookup) / sizeof(TypeLookup); - - for (int i = 0; i < count; ++i) { - if (IsEqualGUID(qt_typeLookup[i].mediaType, type->subtype)) { - return qt_typeLookup[i].pixelFormat; - } + for (const auto &lookupType : qt_typeLookup) { + if (IsEqualGUID(lookupType.mediaType, type->subtype)) + return lookupType.pixelFormat; } return QVideoFrame::Format_Invalid; diff --git a/src/plugins/directshow/common/directshowmediatype.h b/src/plugins/directshow/common/directshowmediatype.h index 7f495f3b2..ee44329a5 100644 --- a/src/plugins/directshow/common/directshowmediatype.h +++ b/src/plugins/directshow/common/directshowmediatype.h @@ -54,13 +54,13 @@ class DirectShowMediaType public: DirectShowMediaType(); DirectShowMediaType(const DirectShowMediaType &other); - DirectShowMediaType(DirectShowMediaType &&other); + DirectShowMediaType(DirectShowMediaType &&other) noexcept; explicit DirectShowMediaType(const AM_MEDIA_TYPE &type); explicit DirectShowMediaType(AM_MEDIA_TYPE &&type); ~DirectShowMediaType() { clear(mediaType); } DirectShowMediaType &operator =(const DirectShowMediaType &other); - DirectShowMediaType &operator =(DirectShowMediaType &&other); + DirectShowMediaType &operator =(DirectShowMediaType &&other) noexcept; void clear() { clear(mediaType); } diff --git a/src/plugins/directshow/common/directshowmediatypeenum.cpp b/src/plugins/directshow/common/directshowmediatypeenum.cpp index a6afcd5f1..10623a246 100644 --- a/src/plugins/directshow/common/directshowmediatypeenum.cpp +++ b/src/plugins/directshow/common/directshowmediatypeenum.cpp @@ -78,21 +78,20 @@ HRESULT DirectShowMediaTypeEnum::QueryInterface(REFIID riid, void **ppv) HRESULT DirectShowMediaTypeEnum::Next(ULONG cMediaTypes, AM_MEDIA_TYPE **ppMediaTypes, ULONG *pcFetched) { - if (ppMediaTypes && (pcFetched || cMediaTypes == 1)) { - ULONG count = qBound<ULONG>(0, cMediaTypes, m_mediaTypes.count() - m_index); - - for (ULONG i = 0; i < count; ++i, ++m_index) { - ppMediaTypes[i] = reinterpret_cast<AM_MEDIA_TYPE *>(CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE))); - DirectShowMediaType::copyToUninitialized(ppMediaTypes[i], &m_mediaTypes.at(m_index)); - } + if (!ppMediaTypes || (!pcFetched && cMediaTypes != 1)) + return E_POINTER; - if (pcFetched) - *pcFetched = count; + ULONG count = qBound<ULONG>(0, cMediaTypes, m_mediaTypes.count() - m_index); - return count == cMediaTypes ? S_OK : S_FALSE; - } else { - return E_POINTER; + for (ULONG i = 0; i < count; ++i, ++m_index) { + ppMediaTypes[i] = reinterpret_cast<AM_MEDIA_TYPE *>(CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE))); + DirectShowMediaType::copyToUninitialized(ppMediaTypes[i], &m_mediaTypes.at(m_index)); } + + if (pcFetched) + *pcFetched = count; + + return count == cMediaTypes ? S_OK : S_FALSE; } HRESULT DirectShowMediaTypeEnum::Skip(ULONG cMediaTypes) @@ -109,14 +108,9 @@ HRESULT DirectShowMediaTypeEnum::Reset() HRESULT DirectShowMediaTypeEnum::Clone(IEnumMediaTypes **ppEnum) { - if (ppEnum) { - if (m_pin) - *ppEnum = new DirectShowMediaTypeEnum(m_pin); - else - *ppEnum = new DirectShowMediaTypeEnum(m_mediaTypes); - return S_OK; - } else { + if (!ppEnum) return E_POINTER; - } + *ppEnum = m_pin ? new DirectShowMediaTypeEnum(m_pin) : new DirectShowMediaTypeEnum(m_mediaTypes); + return S_OK; } diff --git a/src/plugins/directshow/common/directshowpin.cpp b/src/plugins/directshow/common/directshowpin.cpp index 65b54b8e9..508a9b21d 100644 --- a/src/plugins/directshow/common/directshowpin.cpp +++ b/src/plugins/directshow/common/directshowpin.cpp @@ -56,10 +56,7 @@ DirectShowPin::DirectShowPin(DirectShowBaseFilter *filter, const QString &name, { } -DirectShowPin::~DirectShowPin() -{ - -} +DirectShowPin::~DirectShowPin() = default; HRESULT DirectShowPin::Connect(IPin *pReceivePin, const AM_MEDIA_TYPE *pmt) { @@ -233,70 +230,60 @@ HRESULT DirectShowPin::Disconnect() HRESULT DirectShowPin::ConnectedTo(IPin **ppPin) { - if (!ppPin) { + if (!ppPin) return E_POINTER; - } else { - QMutexLocker locker(&m_mutex); - - if (!m_peerPin) { - *ppPin = 0; - return VFW_E_NOT_CONNECTED; - } else { - m_peerPin->AddRef(); - *ppPin = m_peerPin; - return S_OK; - } + + QMutexLocker locker(&m_mutex); + if (!m_peerPin) { + *ppPin = 0; + return VFW_E_NOT_CONNECTED; } + m_peerPin->AddRef(); + *ppPin = m_peerPin; + return S_OK; } HRESULT DirectShowPin::ConnectionMediaType(AM_MEDIA_TYPE *pmt) { - if (!pmt) { + if (!pmt) return E_POINTER; - } else { - QMutexLocker locker(&m_mutex); - if (!m_peerPin) { - DirectShowMediaType::init(pmt); - return VFW_E_NOT_CONNECTED; - } else { - DirectShowMediaType::copy(pmt, &m_mediaType); - return S_OK; - } + QMutexLocker locker(&m_mutex); + if (!m_peerPin) { + DirectShowMediaType::init(pmt); + return VFW_E_NOT_CONNECTED; } + DirectShowMediaType::copy(pmt, &m_mediaType); + return S_OK; } HRESULT DirectShowPin::QueryPinInfo(PIN_INFO *pInfo) { - if (!pInfo) { + if (!pInfo) return E_POINTER; - } else { - pInfo->pFilter = m_filter; - if (m_filter) { - m_filter->AddRef(); - } - pInfo->dir = m_direction; - QString name = m_name; - if (name.length() >= MAX_PIN_NAME) - name.truncate(MAX_PIN_NAME - 1); - int length = name.toWCharArray(pInfo->achName); - pInfo->achName[length] = '\0'; + pInfo->pFilter = m_filter; + if (m_filter) + m_filter->AddRef(); + pInfo->dir = m_direction; - return S_OK; - } + QString name = m_name; + if (name.length() >= MAX_PIN_NAME) + name.truncate(MAX_PIN_NAME - 1); + int length = name.toWCharArray(pInfo->achName); + pInfo->achName[length] = '\0'; + + return S_OK; } HRESULT DirectShowPin::QueryId(LPWSTR *Id) { - if (!Id) { + if (!Id) return E_POINTER; - } else { - const int bytes = (m_name.length() + 1) * 2; - *Id = static_cast<LPWSTR>(::CoTaskMemAlloc(bytes)); - ::memcpy(*Id, m_name.utf16(), bytes); - return S_OK; - } + const int bytes = (m_name.length() + 1) * 2; + *Id = static_cast<LPWSTR>(::CoTaskMemAlloc(bytes)); + ::memcpy(*Id, m_name.utf16(), bytes); + return S_OK; } HRESULT DirectShowPin::QueryAccept(const AM_MEDIA_TYPE *pmt) @@ -312,12 +299,10 @@ HRESULT DirectShowPin::QueryAccept(const AM_MEDIA_TYPE *pmt) HRESULT DirectShowPin::EnumMediaTypes(IEnumMediaTypes **ppEnum) { - if (!ppEnum) { + if (!ppEnum) return E_POINTER; - } else { - *ppEnum = new DirectShowMediaTypeEnum(this); - return S_OK; - } + *ppEnum = new DirectShowMediaTypeEnum(this); + return S_OK; } HRESULT DirectShowPin::QueryInternalConnections(IPin **apPin, ULONG *nPin) @@ -352,12 +337,10 @@ HRESULT DirectShowPin::NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, d HRESULT DirectShowPin::QueryDirection(PIN_DIRECTION *pPinDir) { - if (!pPinDir) { + if (!pPinDir) return E_POINTER; - } else { - *pPinDir = m_direction; - return S_OK; - } + *pPinDir = m_direction; + return S_OK; } QList<DirectShowMediaType> DirectShowPin::supportedMediaTypes() @@ -403,9 +386,7 @@ DirectShowOutputPin::DirectShowOutputPin(DirectShowBaseFilter *filter, const QSt } -DirectShowOutputPin::~DirectShowOutputPin() -{ -} +DirectShowOutputPin::~DirectShowOutputPin() = default; HRESULT DirectShowOutputPin::completeConnection(IPin *pin) { @@ -511,10 +492,7 @@ DirectShowInputPin::DirectShowInputPin(DirectShowBaseFilter *filter, const QStri ZeroMemory(&m_sampleProperties, sizeof(m_sampleProperties)); } -DirectShowInputPin::~DirectShowInputPin() -{ - -} +DirectShowInputPin::~DirectShowInputPin() = default; HRESULT DirectShowInputPin::connectionEnded() { @@ -630,7 +608,8 @@ HRESULT DirectShowInputPin::Receive(IMediaSample *pSample) IMediaSample2 *sample2; if (SUCCEEDED(pSample->QueryInterface(IID_PPV_ARGS(&sample2)))) { - hr = sample2->GetProperties(sizeof(m_sampleProperties), (PBYTE)&m_sampleProperties); + hr = sample2->GetProperties(sizeof(m_sampleProperties), + reinterpret_cast<PBYTE>(&m_sampleProperties)); sample2->Release(); if (FAILED(hr)) return hr; diff --git a/src/plugins/directshow/common/directshowpin.h b/src/plugins/directshow/common/directshowpin.h index 9598cf525..5e513d002 100644 --- a/src/plugins/directshow/common/directshowpin.h +++ b/src/plugins/directshow/common/directshowpin.h @@ -68,30 +68,30 @@ public: virtual HRESULT setActive(bool active); // IPin - STDMETHODIMP Connect(IPin *pReceivePin, const AM_MEDIA_TYPE *pmt); - STDMETHODIMP ReceiveConnection(IPin *pConnector, const AM_MEDIA_TYPE *pmt); - STDMETHODIMP Disconnect(); - STDMETHODIMP ConnectedTo(IPin **ppPin); + STDMETHODIMP Connect(IPin *pReceivePin, const AM_MEDIA_TYPE *pmt) override; + STDMETHODIMP ReceiveConnection(IPin *pConnector, const AM_MEDIA_TYPE *pmt) override; + STDMETHODIMP Disconnect() override; + STDMETHODIMP ConnectedTo(IPin **ppPin) override; - STDMETHODIMP ConnectionMediaType(AM_MEDIA_TYPE *pmt); + STDMETHODIMP ConnectionMediaType(AM_MEDIA_TYPE *pmt) override; - STDMETHODIMP QueryPinInfo(PIN_INFO *pInfo); - STDMETHODIMP QueryId(LPWSTR *Id); + STDMETHODIMP QueryPinInfo(PIN_INFO *pInfo) override; + STDMETHODIMP QueryId(LPWSTR *Id) override; - STDMETHODIMP QueryAccept(const AM_MEDIA_TYPE *pmt); + STDMETHODIMP QueryAccept(const AM_MEDIA_TYPE *pmt) override; - STDMETHODIMP EnumMediaTypes(IEnumMediaTypes **ppEnum); + STDMETHODIMP EnumMediaTypes(IEnumMediaTypes **ppEnum) override; - STDMETHODIMP QueryInternalConnections(IPin **apPin, ULONG *nPin); + STDMETHODIMP QueryInternalConnections(IPin **apPin, ULONG *nPin) override; - STDMETHODIMP EndOfStream(); + STDMETHODIMP EndOfStream() override; - STDMETHODIMP BeginFlush(); - STDMETHODIMP EndFlush(); + STDMETHODIMP BeginFlush() override; + STDMETHODIMP EndFlush() override; - STDMETHODIMP NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate); + STDMETHODIMP NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate) override; - STDMETHODIMP QueryDirection(PIN_DIRECTION *pPinDir); + STDMETHODIMP QueryDirection(PIN_DIRECTION *pPinDir) override; protected: DirectShowPin(DirectShowBaseFilter *filter, const QString &name, PIN_DIRECTION direction); @@ -140,27 +140,28 @@ class DirectShowInputPin : public DirectShowPin , public IMemInputPin { public: - virtual ~DirectShowInputPin(); + ~DirectShowInputPin() override; const AM_SAMPLE2_PROPERTIES *currentSampleProperties() const { return &m_sampleProperties; } // DirectShowPin - HRESULT connectionEnded(); - HRESULT setActive(bool active); + HRESULT connectionEnded() override; + HRESULT setActive(bool active) override; // IPin - STDMETHODIMP EndOfStream(); - STDMETHODIMP BeginFlush(); - STDMETHODIMP EndFlush(); + STDMETHODIMP EndOfStream() override; + STDMETHODIMP BeginFlush() override; + STDMETHODIMP EndFlush() override; // IMemInputPin - STDMETHODIMP GetAllocator(IMemAllocator **ppAllocator); - STDMETHODIMP NotifyAllocator(IMemAllocator *pAllocator, BOOL bReadOnly); - STDMETHODIMP GetAllocatorRequirements(ALLOCATOR_PROPERTIES *pProps); - - STDMETHODIMP Receive(IMediaSample *pSample); - STDMETHODIMP ReceiveMultiple(IMediaSample **pSamples, long nSamples, long *nSamplesProcessed); - STDMETHODIMP ReceiveCanBlock(); + STDMETHODIMP GetAllocator(IMemAllocator **ppAllocator) override; + STDMETHODIMP NotifyAllocator(IMemAllocator *pAllocator, BOOL bReadOnly) override; + STDMETHODIMP GetAllocatorRequirements(ALLOCATOR_PROPERTIES *pProps) override; + + STDMETHODIMP Receive(IMediaSample *pSample) override; + STDMETHODIMP ReceiveMultiple(IMediaSample **pSamples, long nSamples, + long *nSamplesProcessed) override; + STDMETHODIMP ReceiveCanBlock() override; protected: DirectShowInputPin(DirectShowBaseFilter *filter, const QString &name); diff --git a/src/plugins/directshow/common/directshowpinenum.cpp b/src/plugins/directshow/common/directshowpinenum.cpp index e0ab58d19..20fa93d6e 100644 --- a/src/plugins/directshow/common/directshowpinenum.cpp +++ b/src/plugins/directshow/common/directshowpinenum.cpp @@ -87,21 +87,20 @@ HRESULT DirectShowPinEnum::QueryInterface(REFIID riid, void **ppv) HRESULT DirectShowPinEnum::Next(ULONG cPins, IPin **ppPins, ULONG *pcFetched) { - if (ppPins && (pcFetched || cPins == 1)) { - ULONG count = qBound<ULONG>(0, cPins, m_pins.count() - m_index); - - for (ULONG i = 0; i < count; ++i, ++m_index) { - ppPins[i] = m_pins.at(m_index); - ppPins[i]->AddRef(); - } + if (!ppPins || (!pcFetched && cPins != 1)) + return E_POINTER; - if (pcFetched) - *pcFetched = count; + ULONG count = qBound<ULONG>(0, cPins, m_pins.count() - m_index); - return count == cPins ? S_OK : S_FALSE; - } else { - return E_POINTER; + for (ULONG i = 0; i < count; ++i, ++m_index) { + ppPins[i] = m_pins.at(m_index); + ppPins[i]->AddRef(); } + + if (pcFetched) + *pcFetched = count; + + return count == cPins ? S_OK : S_FALSE; } HRESULT DirectShowPinEnum::Skip(ULONG cPins) @@ -120,16 +119,10 @@ HRESULT DirectShowPinEnum::Reset() HRESULT DirectShowPinEnum::Clone(IEnumPins **ppEnum) { - if (ppEnum) { - if (m_filter) - *ppEnum = new DirectShowPinEnum(m_filter); - else - *ppEnum = new DirectShowPinEnum(m_pins); - - return S_OK; - } else { + if (!ppEnum) return E_POINTER; - } + *ppEnum = m_filter ? new DirectShowPinEnum(m_filter) : new DirectShowPinEnum(m_pins); + return S_OK; } QT_END_NAMESPACE diff --git a/src/plugins/directshow/common/directshowsamplegrabber.cpp b/src/plugins/directshow/common/directshowsamplegrabber.cpp index fb95370ca..fec59b538 100644 --- a/src/plugins/directshow/common/directshowsamplegrabber.cpp +++ b/src/plugins/directshow/common/directshowsamplegrabber.cpp @@ -51,20 +51,21 @@ static const CLSID cLSID_SampleGrabber = { 0xC1F400A0, 0x3F08, 0x11d3, { 0x9F, 0 class SampleGrabberCallbackPrivate : public ISampleGrabberCB { + Q_DISABLE_COPY(SampleGrabberCallbackPrivate) public: explicit SampleGrabberCallbackPrivate(DirectShowSampleGrabber *grabber) : m_ref(1) , m_grabber(grabber) { } - virtual ~SampleGrabberCallbackPrivate() { } + virtual ~SampleGrabberCallbackPrivate() = default; - STDMETHODIMP_(ULONG) AddRef() + STDMETHODIMP_(ULONG) AddRef() override { return InterlockedIncrement(&m_ref); } - STDMETHODIMP_(ULONG) Release() + STDMETHODIMP_(ULONG) Release() override { ULONG ref = InterlockedDecrement(&m_ref); if (ref == 0) @@ -72,7 +73,7 @@ public: return ref; } - STDMETHODIMP QueryInterface(REFIID riid, void **ppvObject) + STDMETHODIMP QueryInterface(REFIID riid, void **ppvObject) override { if (NULL == ppvObject) return E_POINTER; @@ -89,7 +90,7 @@ public: return E_NOTIMPL; } - STDMETHODIMP SampleCB(double time, IMediaSample *mediaSample) + STDMETHODIMP SampleCB(double time, IMediaSample *mediaSample) override { if (m_grabber) Q_EMIT m_grabber->sampleAvailable(time, mediaSample); @@ -97,7 +98,7 @@ public: return S_OK; } - STDMETHODIMP BufferCB(double time, BYTE *buffer, long bufferLen) + STDMETHODIMP BufferCB(double time, BYTE *buffer, long bufferLen) override { if (m_grabber) { // Deep copy, the data might be modified or freed after the callback returns diff --git a/src/plugins/directshow/common/directshowvideobuffer.h b/src/plugins/directshow/common/directshowvideobuffer.h index 85e02b53d..a85a3ca34 100644 --- a/src/plugins/directshow/common/directshowvideobuffer.h +++ b/src/plugins/directshow/common/directshowvideobuffer.h @@ -50,14 +50,14 @@ class DirectShowVideoBuffer : public QAbstractVideoBuffer { public: DirectShowVideoBuffer(IMediaSample *sample, int bytesPerLine); - ~DirectShowVideoBuffer(); + ~DirectShowVideoBuffer() override; IMediaSample *sample() { return m_sample; } - uchar *map(MapMode mode, int *numBytes, int *bytesPerLine); - void unmap(); + uchar *map(MapMode mode, int *numBytes, int *bytesPerLine) override; + void unmap() override; - MapMode mapMode() const; + MapMode mapMode() const override; private: IMediaSample *m_sample; diff --git a/src/plugins/directshow/dsserviceplugin.cpp b/src/plugins/directshow/dsserviceplugin.cpp index cb4f0cdf9..64b30f561 100644 --- a/src/plugins/directshow/dsserviceplugin.cpp +++ b/src/plugins/directshow/dsserviceplugin.cpp @@ -114,10 +114,9 @@ void DSServicePlugin::release(QMediaService *service) QMediaServiceProviderHint::Features DSServicePlugin::supportedFeatures( const QByteArray &service) const { - if (service == Q_MEDIASERVICE_MEDIAPLAYER) - return QMediaServiceProviderHint::StreamPlayback | QMediaServiceProviderHint::VideoSurface; - else - return QMediaServiceProviderHint::Features(); + return service == Q_MEDIASERVICE_MEDIAPLAYER + ? (QMediaServiceProviderHint::StreamPlayback | QMediaServiceProviderHint::VideoSurface) + : QMediaServiceProviderHint::Features(); } QByteArray DSServicePlugin::defaultDevice(const QByteArray &service) const diff --git a/src/plugins/directshow/dsserviceplugin.h b/src/plugins/directshow/dsserviceplugin.h index f57262e37..2e87058c3 100644 --- a/src/plugins/directshow/dsserviceplugin.h +++ b/src/plugins/directshow/dsserviceplugin.h @@ -64,14 +64,14 @@ class DSServicePlugin #endif public: - QMediaService* create(QString const& key); - void release(QMediaService *service); + QMediaService* create(QString const& key) override; + void release(QMediaService *service) override; - QMediaServiceProviderHint::Features supportedFeatures(const QByteArray &service) const; + QMediaServiceProviderHint::Features supportedFeatures(const QByteArray &service) const override; - QByteArray defaultDevice(const QByteArray &service) const; - QList<QByteArray> devices(const QByteArray &service) const; - QString deviceDescription(const QByteArray &service, const QByteArray &device); + QByteArray defaultDevice(const QByteArray &service) const override; + QList<QByteArray> devices(const QByteArray &service) const override; + QString deviceDescription(const QByteArray &service, const QByteArray &device) override; }; QT_END_NAMESPACE diff --git a/src/plugins/directshow/player/directshowaudioendpointcontrol.h b/src/plugins/directshow/player/directshowaudioendpointcontrol.h index e0e6a1545..b6f8a6724 100644 --- a/src/plugins/directshow/player/directshowaudioendpointcontrol.h +++ b/src/plugins/directshow/player/directshowaudioendpointcontrol.h @@ -53,16 +53,16 @@ class DirectShowAudioEndpointControl : public QAudioOutputSelectorControl Q_OBJECT public: DirectShowAudioEndpointControl(DirectShowPlayerService *service, QObject *parent = 0); - ~DirectShowAudioEndpointControl(); + ~DirectShowAudioEndpointControl() override; - QList<QString> availableOutputs() const; + QList<QString> availableOutputs() const override; - QString outputDescription(const QString &name) const; + QString outputDescription(const QString &name) const override; - QString defaultOutput() const; - QString activeOutput() const; + QString defaultOutput() const override; + QString activeOutput() const override; - void setActiveOutput(const QString& name); + void setActiveOutput(const QString& name) override; private: void updateEndpoints(); diff --git a/src/plugins/directshow/player/directshowioreader.cpp b/src/plugins/directshow/player/directshowioreader.cpp index 7f3303633..3482cee02 100644 --- a/src/plugins/directshow/player/directshowioreader.cpp +++ b/src/plugins/directshow/player/directshowioreader.cpp @@ -123,76 +123,65 @@ ULONG DirectShowIOReader::Release() HRESULT DirectShowIOReader::RequestAllocator( IMemAllocator *pPreferred, ALLOCATOR_PROPERTIES *pProps, IMemAllocator **ppActual) { - if (!ppActual || !pProps) { + if (!ppActual || !pProps) return E_POINTER; - } else { - ALLOCATOR_PROPERTIES actualProperties; - if (pProps->cbAlign == 0) - pProps->cbAlign = 1; + ALLOCATOR_PROPERTIES actualProperties; - if (pPreferred && pPreferred->SetProperties(pProps, &actualProperties) == S_OK) { - pPreferred->AddRef(); + if (pProps->cbAlign == 0) + pProps->cbAlign = 1; - *ppActual = pPreferred; + if (pPreferred && pPreferred->SetProperties(pProps, &actualProperties) == S_OK) { + pPreferred->AddRef(); - m_source->setAllocator(*ppActual); + *ppActual = pPreferred; + m_source->setAllocator(*ppActual); + return S_OK; + } + *ppActual = com_new<IMemAllocator>(CLSID_MemoryAllocator); + if (*ppActual) { + if ((*ppActual)->SetProperties(pProps, &actualProperties) == S_OK) { + m_source->setAllocator(*ppActual); return S_OK; - } else { - *ppActual = com_new<IMemAllocator>(CLSID_MemoryAllocator); - - if (*ppActual) { - if ((*ppActual)->SetProperties(pProps, &actualProperties) != S_OK) { - (*ppActual)->Release(); - } else { - m_source->setAllocator(*ppActual); - - return S_OK; - } - } } - ppActual = 0; - - return E_FAIL; + (*ppActual)->Release(); } + ppActual = nullptr; + return E_FAIL; } HRESULT DirectShowIOReader::Request(IMediaSample *pSample, DWORD_PTR dwUser) { QMutexLocker locker(&m_mutex); - if (!pSample) { + if (!pSample) return E_POINTER; - } else if (m_flushing) { + if (m_flushing) return VFW_E_WRONG_STATE; - } else { - REFERENCE_TIME startTime = 0; - REFERENCE_TIME endTime = 0; - BYTE *buffer; - if (pSample->GetTime(&startTime, &endTime) != S_OK - || pSample->GetPointer(&buffer) != S_OK) { - return VFW_E_SAMPLE_TIME_NOT_SET; - } else { - LONGLONG position = startTime / 10000000; - LONG length = (endTime - startTime) / 10000000; - - DirectShowSampleRequest *request = new DirectShowSampleRequest( - pSample, dwUser, position, length, buffer); + REFERENCE_TIME startTime = 0; + REFERENCE_TIME endTime = 0; + BYTE *buffer; - if (m_pendingTail) { - m_pendingTail->next = request; - } else { - m_pendingHead = request; + if (pSample->GetTime(&startTime, &endTime) != S_OK + || pSample->GetPointer(&buffer) != S_OK) { + return VFW_E_SAMPLE_TIME_NOT_SET; + } + LONGLONG position = startTime / 10000000; + LONG length = (endTime - startTime) / 10000000; - m_loop->postEvent(this, new QEvent(QEvent::User)); - } - m_pendingTail = request; + auto request = new DirectShowSampleRequest(pSample, dwUser, position, length, buffer); - return S_OK; - } + if (m_pendingTail) { + m_pendingTail->next = request; + } else { + m_pendingHead = request; + m_loop->postEvent(this, new QEvent(QEvent::User)); } + m_pendingTail = request; + + return S_OK; } HRESULT DirectShowIOReader::WaitForNext( @@ -220,7 +209,8 @@ HRESULT DirectShowIOReader::WaitForNext( delete request; return hr; - } else if (m_flushing) { + } + if (m_flushing) { *ppSample = 0; *pdwUser = 0; @@ -236,90 +226,80 @@ HRESULT DirectShowIOReader::WaitForNext( HRESULT DirectShowIOReader::SyncReadAligned(IMediaSample *pSample) { - if (!pSample) { + if (!pSample) return E_POINTER; - } else { - REFERENCE_TIME startTime = 0; - REFERENCE_TIME endTime = 0; - BYTE *buffer; - if (pSample->GetTime(&startTime, &endTime) != S_OK - || pSample->GetPointer(&buffer) != S_OK) { - return VFW_E_SAMPLE_TIME_NOT_SET; - } else { - LONGLONG position = startTime / 10000000; - LONG length = (endTime - startTime) / 10000000; + REFERENCE_TIME startTime = 0; + REFERENCE_TIME endTime = 0; + BYTE *buffer; - QMutexLocker locker(&m_mutex); + if (pSample->GetTime(&startTime, &endTime) != S_OK + || pSample->GetPointer(&buffer) != S_OK) { + return VFW_E_SAMPLE_TIME_NOT_SET; + } + LONGLONG position = startTime / 10000000; + LONG length = (endTime - startTime) / 10000000; - if (thread() == QThread::currentThread()) { - qint64 bytesRead = 0; + QMutexLocker locker(&m_mutex); - HRESULT hr = blockingRead(position, length, buffer, &bytesRead); + if (thread() == QThread::currentThread()) { + qint64 bytesRead = 0; - if (SUCCEEDED(hr)) - pSample->SetActualDataLength(bytesRead); + HRESULT hr = blockingRead(position, length, buffer, &bytesRead); + if (SUCCEEDED(hr)) + pSample->SetActualDataLength(bytesRead); - return hr; - } else { - m_synchronousPosition = position; - m_synchronousLength = length; - m_synchronousBuffer = buffer; + return hr; + } + m_synchronousPosition = position; + m_synchronousLength = length; + m_synchronousBuffer = buffer; - m_loop->postEvent(this, new QEvent(QEvent::User)); + m_loop->postEvent(this, new QEvent(QEvent::User)); - m_wait.wait(&m_mutex); + m_wait.wait(&m_mutex); - m_synchronousBuffer = 0; + m_synchronousBuffer = nullptr; - if (SUCCEEDED(m_synchronousResult)) - pSample->SetActualDataLength(m_synchronousBytesRead); + if (SUCCEEDED(m_synchronousResult)) + pSample->SetActualDataLength(m_synchronousBytesRead); - return m_synchronousResult; - } - } - } + return m_synchronousResult; } HRESULT DirectShowIOReader::SyncRead(LONGLONG llPosition, LONG lLength, BYTE *pBuffer) { - if (!pBuffer) { + if (!pBuffer) return E_POINTER; - } else { - if (thread() == QThread::currentThread()) { - qint64 bytesRead; - return blockingRead(llPosition, lLength, pBuffer, &bytesRead); - } else { - QMutexLocker locker(&m_mutex); + if (thread() == QThread::currentThread()) { + qint64 bytesRead; + return blockingRead(llPosition, lLength, pBuffer, &bytesRead); + } + QMutexLocker locker(&m_mutex); - m_synchronousPosition = llPosition; - m_synchronousLength = lLength; - m_synchronousBuffer = pBuffer; + m_synchronousPosition = llPosition; + m_synchronousLength = lLength; + m_synchronousBuffer = pBuffer; - m_loop->postEvent(this, new QEvent(QEvent::User)); + m_loop->postEvent(this, new QEvent(QEvent::User)); - m_wait.wait(&m_mutex); + m_wait.wait(&m_mutex); - m_synchronousBuffer = 0; + m_synchronousBuffer = nullptr; - return m_synchronousResult; - } - } + return m_synchronousResult; } HRESULT DirectShowIOReader::Length(LONGLONG *pTotal, LONGLONG *pAvailable) { - if (!pTotal || !pAvailable) { + if (!pTotal || !pAvailable) return E_POINTER; - } else { - QMutexLocker locker(&m_mutex); - *pTotal = m_totalLength; - *pAvailable = m_availableLength; - - return S_OK; - } + QMutexLocker locker(&m_mutex); + *pTotal = m_totalLength; + *pAvailable = m_availableLength; + return S_OK; } @@ -432,9 +412,8 @@ HRESULT DirectShowIOReader::blockingRead( ::memset(buffer + *bytesRead, 0, length - *bytesRead); return S_FALSE; - } else { - return S_OK; } + return S_OK; } bool DirectShowIOReader::nonBlockingRead( @@ -447,30 +426,29 @@ bool DirectShowIOReader::nonBlockingRead( *result = S_FALSE; return true; - } else if (m_device->bytesAvailable() + m_device->pos() >= maxSize) { + } + if (m_device->bytesAvailable() + m_device->pos() >= maxSize) { if (m_device->pos() != position && !m_device->seek(position)) { *bytesRead = 0; *result = S_FALSE; return true; - } else { - const qint64 maxBytes = qMin<qint64>(length, m_device->bytesAvailable()); - - *bytesRead = m_device->read(reinterpret_cast<char *>(buffer), maxBytes); + } + const qint64 maxBytes = qMin<qint64>(length, m_device->bytesAvailable()); - if (*bytesRead != length) { - ::memset(buffer + *bytesRead, 0, length - *bytesRead); + *bytesRead = m_device->read(reinterpret_cast<char *>(buffer), maxBytes); - *result = S_FALSE; - } else { - *result = S_OK; - } + if (*bytesRead != length) { + ::memset(buffer + *bytesRead, 0, length - *bytesRead); - return true; + *result = S_FALSE; + } else { + *result = S_OK; } - } else { - return false; + + return true; } + return false; } void DirectShowIOReader::flushRequests() diff --git a/src/plugins/directshow/player/directshowioreader.h b/src/plugins/directshow/player/directshowioreader.h index 2d62c0b95..550990648 100644 --- a/src/plugins/directshow/player/directshowioreader.h +++ b/src/plugins/directshow/player/directshowioreader.h @@ -58,33 +58,34 @@ class DirectShowIOReader : public QObject, public IAsyncReader Q_OBJECT public: DirectShowIOReader(QIODevice *device, DirectShowIOSource *source, DirectShowEventLoop *loop); - ~DirectShowIOReader(); + ~DirectShowIOReader() override; // IUnknown - HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject); - ULONG STDMETHODCALLTYPE AddRef(); - ULONG STDMETHODCALLTYPE Release(); + HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject) override; + ULONG STDMETHODCALLTYPE AddRef() override; + ULONG STDMETHODCALLTYPE Release() override; // IAsyncReader HRESULT STDMETHODCALLTYPE RequestAllocator( - IMemAllocator *pPreferred, ALLOCATOR_PROPERTIES *pProps, IMemAllocator **ppActual); + IMemAllocator *pPreferred, ALLOCATOR_PROPERTIES *pProps, + IMemAllocator **ppActual) override; - HRESULT STDMETHODCALLTYPE Request(IMediaSample *pSample, DWORD_PTR dwUser); + HRESULT STDMETHODCALLTYPE Request(IMediaSample *pSample, DWORD_PTR dwUser) override; HRESULT STDMETHODCALLTYPE WaitForNext( - DWORD dwTimeout, IMediaSample **ppSample, DWORD_PTR *pdwUser); + DWORD dwTimeout, IMediaSample **ppSample, DWORD_PTR *pdwUser) override; - HRESULT STDMETHODCALLTYPE SyncReadAligned(IMediaSample *pSample); + HRESULT STDMETHODCALLTYPE SyncReadAligned(IMediaSample *pSample) override; - HRESULT STDMETHODCALLTYPE SyncRead(LONGLONG llPosition, LONG lLength, BYTE *pBuffer); + HRESULT STDMETHODCALLTYPE SyncRead(LONGLONG llPosition, LONG lLength, BYTE *pBuffer) override; - HRESULT STDMETHODCALLTYPE Length(LONGLONG *pTotal, LONGLONG *pAvailable); + HRESULT STDMETHODCALLTYPE Length(LONGLONG *pTotal, LONGLONG *pAvailable) override; - HRESULT STDMETHODCALLTYPE BeginFlush(); - HRESULT STDMETHODCALLTYPE EndFlush(); + HRESULT STDMETHODCALLTYPE BeginFlush() override; + HRESULT STDMETHODCALLTYPE EndFlush() override; protected: - void customEvent(QEvent *event); + void customEvent(QEvent *event) override; private Q_SLOTS: void readyRead(); diff --git a/src/plugins/directshow/player/directshowiosource.cpp b/src/plugins/directshow/player/directshowiosource.cpp index b3aa3fab9..31e9a1300 100644 --- a/src/plugins/directshow/player/directshowiosource.cpp +++ b/src/plugins/directshow/player/directshowiosource.cpp @@ -99,8 +99,8 @@ DirectShowIOSource::DirectShowIOSource(DirectShowEventLoop *loop) static const int count = sizeof(directshow_subtypes) / sizeof(GUID); - for (int i = 0; i < count; ++i) { - type.subtype = directshow_subtypes[i]; + for (const auto &directshowSubtype : directshow_subtypes) { + type.subtype = directshowSubtype; m_supportedMediaTypes.append(DirectShowMediaType(type)); } } @@ -140,12 +140,11 @@ HRESULT DirectShowIOSource::QueryInterface(REFIID riid, void **ppvObject) static const GUID iid_IAmFilterMiscFlags = { 0x2dd74950, 0xa890, 0x11d1, {0xab, 0xe8, 0x00, 0xa0, 0xc9, 0x05, 0xf3, 0x75}}; - if (!ppvObject) { + if (!ppvObject) return E_POINTER; - } else if (riid == IID_IUnknown - || riid == IID_IPersist - || riid == IID_IMediaFilter - || riid == IID_IBaseFilter) { + + if (riid == IID_IUnknown || riid == IID_IPersist || riid == IID_IMediaFilter + || riid == IID_IBaseFilter) { *ppvObject = static_cast<IBaseFilter *>(this); } else if (riid == iid_IAmFilterMiscFlags) { *ppvObject = static_cast<IAMFilterMiscFlags *>(this); @@ -222,15 +221,12 @@ HRESULT DirectShowIOSource::GetState(DWORD dwMilliSecsTimeout, FILTER_STATE *pSt { Q_UNUSED(dwMilliSecsTimeout); - if (!pState) { + if (!pState) return E_POINTER; - } else { - QMutexLocker locker(&m_mutex); - - *pState = m_state; - return S_OK; - } + QMutexLocker locker(&m_mutex); + *pState = m_state; + return S_OK; } HRESULT DirectShowIOSource::SetSyncSource(IReferenceClock *pClock) @@ -250,53 +246,41 @@ HRESULT DirectShowIOSource::SetSyncSource(IReferenceClock *pClock) HRESULT DirectShowIOSource::GetSyncSource(IReferenceClock **ppClock) { - if (!ppClock) { + if (!ppClock) return E_POINTER; - } else { - if (!m_clock) { - *ppClock = 0; - - return S_FALSE; - } else { - m_clock->AddRef(); - *ppClock = m_clock; - - return S_OK; - } + if (!m_clock) { + *ppClock = nullptr; + return S_FALSE; } + m_clock->AddRef(); + *ppClock = m_clock; + return S_OK; } // IBaseFilter HRESULT DirectShowIOSource::EnumPins(IEnumPins **ppEnum) { - if (!ppEnum) { + if (!ppEnum) return E_POINTER; - } else { - *ppEnum = new DirectShowPinEnum(QList<IPin *>() << this); - return S_OK; - } + *ppEnum = new DirectShowPinEnum(QList<IPin *>() << this); + return S_OK; } HRESULT DirectShowIOSource::FindPin(LPCWSTR Id, IPin **ppPin) { - if (!ppPin || !Id) { + if (!ppPin || !Id) return E_POINTER; - } else { - QMutexLocker locker(&m_mutex); - if (QString::fromWCharArray(Id) == m_pinId) { - AddRef(); - - *ppPin = this; - return S_OK; - } else { - *ppPin = 0; - - return VFW_E_NOT_FOUND; - } + QMutexLocker locker(&m_mutex); + if (m_pinId == QStringView(Id)) { + AddRef(); + *ppPin = this; + return S_OK; } + *ppPin = nullptr; + return VFW_E_NOT_FOUND; } HRESULT DirectShowIOSource::JoinFilterGraph(IFilterGraph *pGraph, LPCWSTR pName) @@ -311,24 +295,22 @@ HRESULT DirectShowIOSource::JoinFilterGraph(IFilterGraph *pGraph, LPCWSTR pName) HRESULT DirectShowIOSource::QueryFilterInfo(FILTER_INFO *pInfo) { - if (!pInfo) { + if (!pInfo) return E_POINTER; - } else { - QString name = m_filterName; - if (name.length() >= MAX_FILTER_NAME) - name.truncate(MAX_FILTER_NAME - 1); + QString name = m_filterName; + if (name.length() >= MAX_FILTER_NAME) + name.truncate(MAX_FILTER_NAME - 1); - int length = name.toWCharArray(pInfo->achName); - pInfo->achName[length] = '\0'; + int length = name.toWCharArray(pInfo->achName); + pInfo->achName[length] = '\0'; - if (m_graph) - m_graph->AddRef(); + if (m_graph) + m_graph->AddRef(); - pInfo->pGraph = m_graph; + pInfo->pGraph = m_graph; - return S_OK; - } + return S_OK; } HRESULT DirectShowIOSource::QueryVendorInfo(LPWSTR *pVendorInfo) @@ -424,121 +406,96 @@ HRESULT DirectShowIOSource::Disconnect() { QMutexLocker locker(&m_mutex); - if (!m_peerPin) { + if (!m_peerPin) return S_FALSE; - } else if (m_state != State_Stopped) { + if (m_state != State_Stopped) return VFW_E_NOT_STOPPED; - } else { - HRESULT hr = m_peerPin->Disconnect(); - if (!SUCCEEDED(hr)) - return hr; + HRESULT hr = m_peerPin->Disconnect(); + if (!SUCCEEDED(hr)) + return hr; - if (m_allocator) { - m_allocator->Release(); - m_allocator = 0; - } + if (m_allocator) { + m_allocator->Release(); + m_allocator = nullptr; + } - m_peerPin->Release(); - m_peerPin = 0; + m_peerPin->Release(); + m_peerPin = nullptr; - return S_OK; - } + return S_OK; } HRESULT DirectShowIOSource::ConnectedTo(IPin **ppPin) { - if (!ppPin) { + if (!ppPin) return E_POINTER; - } else { - QMutexLocker locker(&m_mutex); - if (!m_peerPin) { - *ppPin = 0; - - return VFW_E_NOT_CONNECTED; - } else { - m_peerPin->AddRef(); - - *ppPin = m_peerPin; - - return S_OK; - } + QMutexLocker locker(&m_mutex); + if (!m_peerPin) { + *ppPin = nullptr; + return VFW_E_NOT_CONNECTED; } + m_peerPin->AddRef(); + *ppPin = m_peerPin; + return S_OK; } HRESULT DirectShowIOSource::ConnectionMediaType(AM_MEDIA_TYPE *pmt) { - if (!pmt) { + if (!pmt) return E_POINTER; - } else { - QMutexLocker locker(&m_mutex); - - if (!m_peerPin) { - pmt = 0; - return VFW_E_NOT_CONNECTED; - } else { - DirectShowMediaType::copy(pmt, &m_connectionMediaType); - - return S_OK; - } + QMutexLocker locker(&m_mutex); + if (!m_peerPin) { + pmt = nullptr; + return VFW_E_NOT_CONNECTED; } + DirectShowMediaType::copy(pmt, &m_connectionMediaType); + return S_OK; } HRESULT DirectShowIOSource::QueryPinInfo(PIN_INFO *pInfo) { - if (!pInfo) { + if (!pInfo) return E_POINTER; - } else { - AddRef(); - pInfo->pFilter = this; - pInfo->dir = PINDIR_OUTPUT; + AddRef(); - const int bytes = qMin(MAX_FILTER_NAME, (m_pinId.length() + 1) * 2); + pInfo->pFilter = this; + pInfo->dir = PINDIR_OUTPUT; - ::memcpy(pInfo->achName, m_pinId.utf16(), bytes); + const int bytes = qMin(MAX_FILTER_NAME, (m_pinId.length() + 1) * 2); - return S_OK; - } + ::memcpy(pInfo->achName, m_pinId.utf16(), bytes); + + return S_OK; } HRESULT DirectShowIOSource::QueryId(LPWSTR *Id) { - if (!Id) { + if (!Id) return E_POINTER; - } else { - const int bytes = (m_pinId.length() + 1) * 2; - - *Id = static_cast<LPWSTR>(::CoTaskMemAlloc(bytes)); - - ::memcpy(*Id, m_pinId.utf16(), bytes); - return S_OK; - } + const int bytes = (m_pinId.length() + 1) * 2; + *Id = static_cast<LPWSTR>(::CoTaskMemAlloc(bytes)); + ::memcpy(*Id, m_pinId.utf16(), bytes); + return S_OK; } HRESULT DirectShowIOSource::QueryAccept(const AM_MEDIA_TYPE *pmt) { - if (!pmt) { + if (!pmt) return E_POINTER; - } else if (pmt->majortype == MEDIATYPE_Stream) { - return S_OK; - } else { - return S_FALSE; - } + return pmt->majortype == MEDIATYPE_Stream ? S_OK : S_FALSE; } HRESULT DirectShowIOSource::EnumMediaTypes(IEnumMediaTypes **ppEnum) { - if (!ppEnum) { + if (!ppEnum) return E_POINTER; - } else { - *ppEnum = new DirectShowMediaTypeEnum(m_supportedMediaTypes); - - return S_OK; - } + *ppEnum = new DirectShowMediaTypeEnum(m_supportedMediaTypes); + return S_OK; } HRESULT DirectShowIOSource::QueryInternalConnections(IPin **apPin, ULONG *nPin) @@ -575,13 +532,10 @@ HRESULT DirectShowIOSource::NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tSt HRESULT DirectShowIOSource::QueryDirection(PIN_DIRECTION *pPinDir) { - if (!pPinDir) { + if (!pPinDir) return E_POINTER; - } else { - *pPinDir = PINDIR_OUTPUT; - - return S_OK; - } + *pPinDir = PINDIR_OUTPUT; + return S_OK; } QT_END_NAMESPACE diff --git a/src/plugins/directshow/player/directshowiosource.h b/src/plugins/directshow/player/directshowiosource.h index 43df6c34f..02639de7c 100644 --- a/src/plugins/directshow/player/directshowiosource.h +++ b/src/plugins/directshow/player/directshowiosource.h @@ -53,6 +53,7 @@ class DirectShowIOSource , public IAMFilterMiscFlags , public IPin { + Q_DISABLE_COPY(DirectShowIOSource) public: DirectShowIOSource(DirectShowEventLoop *loop); virtual ~DirectShowIOSource(); @@ -61,60 +62,61 @@ public: void setAllocator(IMemAllocator *allocator); // IUnknown - HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject); - ULONG STDMETHODCALLTYPE AddRef(); - ULONG STDMETHODCALLTYPE Release(); + HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject) override; + ULONG STDMETHODCALLTYPE AddRef() override; + ULONG STDMETHODCALLTYPE Release() override; // IPersist - HRESULT STDMETHODCALLTYPE GetClassID(CLSID *pClassID); + HRESULT STDMETHODCALLTYPE GetClassID(CLSID *pClassID) override; // IMediaFilter - HRESULT STDMETHODCALLTYPE Run(REFERENCE_TIME tStart); - HRESULT STDMETHODCALLTYPE Pause(); - HRESULT STDMETHODCALLTYPE Stop(); + HRESULT STDMETHODCALLTYPE Run(REFERENCE_TIME tStart) override; + HRESULT STDMETHODCALLTYPE Pause() override; + HRESULT STDMETHODCALLTYPE Stop() override; - HRESULT STDMETHODCALLTYPE GetState(DWORD dwMilliSecsTimeout, FILTER_STATE *pState); + HRESULT STDMETHODCALLTYPE GetState(DWORD dwMilliSecsTimeout, FILTER_STATE *pState) override; - HRESULT STDMETHODCALLTYPE SetSyncSource(IReferenceClock *pClock); - HRESULT STDMETHODCALLTYPE GetSyncSource(IReferenceClock **ppClock); + HRESULT STDMETHODCALLTYPE SetSyncSource(IReferenceClock *pClock) override; + HRESULT STDMETHODCALLTYPE GetSyncSource(IReferenceClock **ppClock) override; // IBaseFilter - HRESULT STDMETHODCALLTYPE EnumPins(IEnumPins **ppEnum); - HRESULT STDMETHODCALLTYPE FindPin(LPCWSTR Id, IPin **ppPin); + HRESULT STDMETHODCALLTYPE EnumPins(IEnumPins **ppEnum) override; + HRESULT STDMETHODCALLTYPE FindPin(LPCWSTR Id, IPin **ppPin) override; - HRESULT STDMETHODCALLTYPE JoinFilterGraph(IFilterGraph *pGraph, LPCWSTR pName); + HRESULT STDMETHODCALLTYPE JoinFilterGraph(IFilterGraph *pGraph, LPCWSTR pName) override; - HRESULT STDMETHODCALLTYPE QueryFilterInfo(FILTER_INFO *pInfo); - HRESULT STDMETHODCALLTYPE QueryVendorInfo(LPWSTR *pVendorInfo); + HRESULT STDMETHODCALLTYPE QueryFilterInfo(FILTER_INFO *pInfo) override; + HRESULT STDMETHODCALLTYPE QueryVendorInfo(LPWSTR *pVendorInfo) override; // IAMFilterMiscFlags - ULONG STDMETHODCALLTYPE GetMiscFlags(); + ULONG STDMETHODCALLTYPE GetMiscFlags() override; // IPin - HRESULT STDMETHODCALLTYPE Connect(IPin *pReceivePin, const AM_MEDIA_TYPE *pmt); - HRESULT STDMETHODCALLTYPE ReceiveConnection(IPin *pConnector, const AM_MEDIA_TYPE *pmt); - HRESULT STDMETHODCALLTYPE Disconnect(); - HRESULT STDMETHODCALLTYPE ConnectedTo(IPin **ppPin); + HRESULT STDMETHODCALLTYPE Connect(IPin *pReceivePin, const AM_MEDIA_TYPE *pmt) override; + HRESULT STDMETHODCALLTYPE ReceiveConnection(IPin *pConnector, const AM_MEDIA_TYPE *pmt) override; + HRESULT STDMETHODCALLTYPE Disconnect() override; + HRESULT STDMETHODCALLTYPE ConnectedTo(IPin **ppPin) override; - HRESULT STDMETHODCALLTYPE ConnectionMediaType(AM_MEDIA_TYPE *pmt); + HRESULT STDMETHODCALLTYPE ConnectionMediaType(AM_MEDIA_TYPE *pmt) override; - HRESULT STDMETHODCALLTYPE QueryPinInfo(PIN_INFO *pInfo); - HRESULT STDMETHODCALLTYPE QueryId(LPWSTR *Id); + HRESULT STDMETHODCALLTYPE QueryPinInfo(PIN_INFO *pInfo) override; + HRESULT STDMETHODCALLTYPE QueryId(LPWSTR *Id) override; - HRESULT STDMETHODCALLTYPE QueryAccept(const AM_MEDIA_TYPE *pmt); + HRESULT STDMETHODCALLTYPE QueryAccept(const AM_MEDIA_TYPE *pmt) override; - HRESULT STDMETHODCALLTYPE EnumMediaTypes(IEnumMediaTypes **ppEnum); + HRESULT STDMETHODCALLTYPE EnumMediaTypes(IEnumMediaTypes **ppEnum) override; - HRESULT STDMETHODCALLTYPE QueryInternalConnections(IPin **apPin, ULONG *nPin); + HRESULT STDMETHODCALLTYPE QueryInternalConnections(IPin **apPin, ULONG *nPin) override; - HRESULT STDMETHODCALLTYPE EndOfStream(); + HRESULT STDMETHODCALLTYPE EndOfStream() override; - HRESULT STDMETHODCALLTYPE BeginFlush(); - HRESULT STDMETHODCALLTYPE EndFlush(); + HRESULT STDMETHODCALLTYPE BeginFlush() override; + HRESULT STDMETHODCALLTYPE EndFlush() override; - HRESULT STDMETHODCALLTYPE NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate); + HRESULT STDMETHODCALLTYPE NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, + double dRate) override; - HRESULT STDMETHODCALLTYPE QueryDirection(PIN_DIRECTION *pPinDir); + HRESULT STDMETHODCALLTYPE QueryDirection(PIN_DIRECTION *pPinDir) override; private: volatile LONG m_ref; diff --git a/src/plugins/directshow/player/directshowmetadatacontrol.cpp b/src/plugins/directshow/player/directshowmetadatacontrol.cpp index 84f990830..90d2b3e7d 100644 --- a/src/plugins/directshow/player/directshowmetadatacontrol.cpp +++ b/src/plugins/directshow/player/directshowmetadatacontrol.cpp @@ -113,101 +113,99 @@ static QString nameForGUIDString(const QString &guid) // Audio formats if (guid == "{00001610-0000-0010-8000-00AA00389B71}" || guid == "{000000FF-0000-0010-8000-00AA00389B71}") return QStringLiteral("MPEG AAC Audio"); - else if (guid == "{00001600-0000-0010-8000-00AA00389B71}") + if (guid == "{00001600-0000-0010-8000-00AA00389B71}") return QStringLiteral("MPEG ADTS AAC Audio"); - else if (guid == "{00000092-0000-0010-8000-00AA00389B71}") + if (guid == "{00000092-0000-0010-8000-00AA00389B71}") return QStringLiteral("Dolby AC-3 SPDIF"); - else if (guid == "{E06D802C-DB46-11CF-B4D1-00805F6CBBEA}" || guid == "{00002000-0000-0010-8000-00AA00389B71}") + if (guid == "{E06D802C-DB46-11CF-B4D1-00805F6CBBEA}" || guid == "{00002000-0000-0010-8000-00AA00389B71}") return QStringLiteral("Dolby AC-3"); - else if (guid == "{A7FB87AF-2D02-42FB-A4D4-05CD93843BDD}") + if (guid == "{A7FB87AF-2D02-42FB-A4D4-05CD93843BDD}") return QStringLiteral("Dolby Digital Plus"); - else if (guid == "{00000009-0000-0010-8000-00AA00389B71}") + if (guid == "{00000009-0000-0010-8000-00AA00389B71}") return QStringLiteral("DRM"); - else if (guid == "{00000008-0000-0010-8000-00AA00389B71}") + if (guid == "{00000008-0000-0010-8000-00AA00389B71}") return QStringLiteral("Digital Theater Systems Audio (DTS)"); - else if (guid == "{00000003-0000-0010-8000-00AA00389B71}") + if (guid == "{00000003-0000-0010-8000-00AA00389B71}") return QStringLiteral("IEEE Float Audio"); - else if (guid == "{00000055-0000-0010-8000-00AA00389B71}") + if (guid == "{00000055-0000-0010-8000-00AA00389B71}") return QStringLiteral("MPEG Audio Layer-3 (MP3)"); - else if (guid == "{00000050-0000-0010-8000-00AA00389B71}") + if (guid == "{00000050-0000-0010-8000-00AA00389B71}") return QStringLiteral("MPEG-1 Audio"); - else if (guid == "{2E6D7033-767A-494D-B478-F29D25DC9037}") + if (guid == "{2E6D7033-767A-494D-B478-F29D25DC9037}") return QStringLiteral("MPEG Audio Layer 1/2"); - else if (guid == "{0000000A-0000-0010-8000-00AA00389B71}") + if (guid == "{0000000A-0000-0010-8000-00AA00389B71}") return QStringLiteral("Windows Media Audio Voice"); - else if (guid == "{00000001-0000-0010-8000-00AA00389B71}") + if (guid == "{00000001-0000-0010-8000-00AA00389B71}") return QStringLiteral("Uncompressed PCM Audio"); - else if (guid == "{00000164-0000-0010-8000-00AA00389B71}") + if (guid == "{00000164-0000-0010-8000-00AA00389B71}") return QStringLiteral("Windows Media Audio 9 SPDIF"); - else if (guid == "{00000161-0000-0010-8000-00AA00389B71}") + if (guid == "{00000161-0000-0010-8000-00AA00389B71}") return QStringLiteral("Windows Media Audio 8 (WMA2)"); - else if (guid == "{00000162-0000-0010-8000-00AA00389B71}") + if (guid == "{00000162-0000-0010-8000-00AA00389B71}") return QStringLiteral("Windows Media Audio 9 (WMA3"); - else if (guid == "{00000163-0000-0010-8000-00AA00389B71}") + if (guid == "{00000163-0000-0010-8000-00AA00389B71}") return QStringLiteral("Windows Media Audio 9 Lossless"); - else if (guid == "{8D2FD10B-5841-4a6b-8905-588FEC1ADED9}") + if (guid == "{8D2FD10B-5841-4a6b-8905-588FEC1ADED9}") return QStringLiteral("Vorbis"); - else if (guid == "{0000F1AC-0000-0010-8000-00AA00389B71}") + if (guid == "{0000F1AC-0000-0010-8000-00AA00389B71}") return QStringLiteral("Free Lossless Audio Codec (FLAC)"); - else if (guid == "{00006C61-0000-0010-8000-00AA00389B71}") + if (guid == "{00006C61-0000-0010-8000-00AA00389B71}") return QStringLiteral("Apple Lossless Audio Codec (ALAC)"); // Video formats if (guid == "{35327664-0000-0010-8000-00AA00389B71}") return QStringLiteral("DVCPRO 25 (DV25)"); - else if (guid == "{30357664-0000-0010-8000-00AA00389B71}") + if (guid == "{30357664-0000-0010-8000-00AA00389B71}") return QStringLiteral("DVCPRO 50 (DV50)"); - else if (guid == "{20637664-0000-0010-8000-00AA00389B71}") + if (guid == "{20637664-0000-0010-8000-00AA00389B71}") return QStringLiteral("DVC/DV Video"); - else if (guid == "{31687664-0000-0010-8000-00AA00389B71}") + if (guid == "{31687664-0000-0010-8000-00AA00389B71}") return QStringLiteral("DVCPRO 100 (DVH1)"); - else if (guid == "{64687664-0000-0010-8000-00AA00389B71}") + if (guid == "{64687664-0000-0010-8000-00AA00389B71}") return QStringLiteral("HD-DVCR (DVHD)"); - else if (guid == "{64737664-0000-0010-8000-00AA00389B71}") + if (guid == "{64737664-0000-0010-8000-00AA00389B71}") return QStringLiteral("SDL-DVCR (DVSD)"); - else if (guid == "{6C737664-0000-0010-8000-00AA00389B71}") + if (guid == "{6C737664-0000-0010-8000-00AA00389B71}") return QStringLiteral("SD-DVCR (DVSL)"); - else if (guid == "{33363248-0000-0010-8000-00AA00389B71}") + if (guid == "{33363248-0000-0010-8000-00AA00389B71}") return QStringLiteral("H.263 Video"); - else if (guid == "{34363248-0000-0010-8000-00AA00389B71}") + if (guid == "{34363248-0000-0010-8000-00AA00389B71}") return QStringLiteral("H.264 Video"); - else if (guid == "{35363248-0000-0010-8000-00AA00389B71}") + if (guid == "{35363248-0000-0010-8000-00AA00389B71}") return QStringLiteral("H.265 Video"); - else if (guid == "{43564548-0000-0010-8000-00AA00389B71}") + if (guid == "{43564548-0000-0010-8000-00AA00389B71}") return QStringLiteral("High Efficiency Video Coding (HEVC)"); - else if (guid == "{3253344D-0000-0010-8000-00AA00389B71}") + if (guid == "{3253344D-0000-0010-8000-00AA00389B71}") return QStringLiteral("MPEG-4 part 2 Video (M4S2)"); - else if (guid == "{47504A4D-0000-0010-8000-00AA00389B71}") + if (guid == "{47504A4D-0000-0010-8000-00AA00389B71}") return QStringLiteral("Motion JPEG (MJPG)"); - else if (guid == "{3334504D-0000-0010-8000-00AA00389B71}") + if (guid == "{3334504D-0000-0010-8000-00AA00389B71}") return QStringLiteral("Microsoft MPEG 4 version 3 (MP43)"); - else if (guid == "{5334504D-0000-0010-8000-00AA00389B71}") + if (guid == "{5334504D-0000-0010-8000-00AA00389B71}") return QStringLiteral("ISO MPEG 4 version 1 (MP4S)"); - else if (guid == "{5634504D-0000-0010-8000-00AA00389B71}") + if (guid == "{5634504D-0000-0010-8000-00AA00389B71}") return QStringLiteral("MPEG-4 part 2 Video (MP4V)"); - else if (guid == "{E06D8026-DB46-11CF-B4D1-00805F6CBBEA}") + if (guid == "{E06D8026-DB46-11CF-B4D1-00805F6CBBEA}") return QStringLiteral("MPEG-2 Video"); - else if (guid == "{3147504D-0000-0010-8000-00AA00389B71}") + if (guid == "{3147504D-0000-0010-8000-00AA00389B71}") return QStringLiteral("MPEG-1 Video"); - else if (guid == "{3153534D-0000-0010-8000-00AA00389B71}") + if (guid == "{3153534D-0000-0010-8000-00AA00389B71}") return QStringLiteral("Windows Media Screen 1 (MSS1)"); - else if (guid == "{3253534D-0000-0010-8000-00AA00389B71}") + if (guid == "{3253534D-0000-0010-8000-00AA00389B71}") return QStringLiteral("Windows Media Video 9 Screen (MSS2)"); - else if (guid == "{31564D57-0000-0010-8000-00AA00389B71}") + if (guid == "{31564D57-0000-0010-8000-00AA00389B71}") return QStringLiteral("Windows Media Video 7 (WMV1)"); - else if (guid == "{32564D57-0000-0010-8000-00AA00389B71}") + if (guid == "{32564D57-0000-0010-8000-00AA00389B71}") return QStringLiteral("Windows Media Video 8 (WMV2)"); - else if (guid == "{33564D57-0000-0010-8000-00AA00389B71}") + if (guid == "{33564D57-0000-0010-8000-00AA00389B71}") return QStringLiteral("Windows Media Video 9 (WMV3)"); - else if (guid == "{31435657-0000-0010-8000-00AA00389B71}") + if (guid == "{31435657-0000-0010-8000-00AA00389B71}") return QStringLiteral("Windows Media Video VC1 (WVC1)"); - else if (guid == "{30385056-0000-0010-8000-00AA00389B71}") + if (guid == "{30385056-0000-0010-8000-00AA00389B71}") return QStringLiteral("VP8 Video"); - else if (guid == "{30395056-0000-0010-8000-00AA00389B71}") + if (guid == "{30395056-0000-0010-8000-00AA00389B71}") return QStringLiteral("VP9 Video"); - - else - return QStringLiteral("Unknown codec"); + return QStringLiteral("Unknown codec"); } typedef HRESULT (WINAPI *q_SHCreateItemFromParsingName)(PCWSTR, IBindCtx *, const GUID&, void **); @@ -451,9 +449,7 @@ DirectShowMetaDataControl::DirectShowMetaDataControl(QObject *parent) { } -DirectShowMetaDataControl::~DirectShowMetaDataControl() -{ -} +DirectShowMetaDataControl::~DirectShowMetaDataControl() = default; bool DirectShowMetaDataControl::isMetaDataAvailable() const { diff --git a/src/plugins/directshow/player/directshowmetadatacontrol.h b/src/plugins/directshow/player/directshowmetadatacontrol.h index 3d2fa5e8e..ea20bf0c5 100644 --- a/src/plugins/directshow/player/directshowmetadatacontrol.h +++ b/src/plugins/directshow/player/directshowmetadatacontrol.h @@ -55,19 +55,19 @@ class DirectShowMetaDataControl : public QMetaDataReaderControl Q_OBJECT public: DirectShowMetaDataControl(QObject *parent = 0); - ~DirectShowMetaDataControl(); + ~DirectShowMetaDataControl() override; - bool isMetaDataAvailable() const; + bool isMetaDataAvailable() const override; - QVariant metaData(const QString &key) const; - QStringList availableMetaData() const; + QVariant metaData(const QString &key) const override; + QStringList availableMetaData() const override; void reset(); void updateMetadata(IFilterGraph2 *graph, IBaseFilter *source, const QString &fileSrc = QString()); protected: - void customEvent(QEvent *event); + void customEvent(QEvent *event) override; private: void setMetadataAvailable(bool available); diff --git a/src/plugins/directshow/player/directshowplayercontrol.h b/src/plugins/directshow/player/directshowplayercontrol.h index fd2c21c38..dba9ab9a0 100644 --- a/src/plugins/directshow/player/directshowplayercontrol.h +++ b/src/plugins/directshow/player/directshowplayercontrol.h @@ -56,42 +56,42 @@ class DirectShowPlayerControl : public QMediaPlayerControl Q_OBJECT public: DirectShowPlayerControl(DirectShowPlayerService *service, QObject *parent = 0); - ~DirectShowPlayerControl(); + ~DirectShowPlayerControl() override; - QMediaPlayer::State state() const; + QMediaPlayer::State state() const override; - QMediaPlayer::MediaStatus mediaStatus() const; + QMediaPlayer::MediaStatus mediaStatus() const override; - qint64 duration() const; + qint64 duration() const override; - qint64 position() const; - void setPosition(qint64 position); + qint64 position() const override; + void setPosition(qint64 position) override; - int volume() const; - void setVolume(int volume); + int volume() const override; + void setVolume(int volume) override; - bool isMuted() const; - void setMuted(bool muted); + bool isMuted() const override; + void setMuted(bool muted) override; - int bufferStatus() const; + int bufferStatus() const override; - bool isAudioAvailable() const; - bool isVideoAvailable() const; + bool isAudioAvailable() const override; + bool isVideoAvailable() const override; - bool isSeekable() const; + bool isSeekable() const override; - QMediaTimeRange availablePlaybackRanges() const; + QMediaTimeRange availablePlaybackRanges() const override; - qreal playbackRate() const; - void setPlaybackRate(qreal rate); + qreal playbackRate() const override; + void setPlaybackRate(qreal rate) override; - QMediaContent media() const; - const QIODevice *mediaStream() const; - void setMedia(const QMediaContent &media, QIODevice *stream); + QMediaContent media() const override; + const QIODevice *mediaStream() const override; + void setMedia(const QMediaContent &media, QIODevice *stream) override; - void play(); - void pause(); - void stop(); + void play() override; + void pause() override; + void stop() override; void updateState(QMediaPlayer::State state); void updateStatus(QMediaPlayer::MediaStatus status); @@ -102,7 +102,7 @@ public: void updatePosition(qint64 position); protected: - void customEvent(QEvent *event); + void customEvent(QEvent *event) override; private: enum Properties diff --git a/src/plugins/directshow/player/directshowplayerservice.cpp b/src/plugins/directshow/player/directshowplayerservice.cpp index b975677a6..27108063d 100644 --- a/src/plugins/directshow/player/directshowplayerservice.cpp +++ b/src/plugins/directshow/player/directshowplayerservice.cpp @@ -61,6 +61,8 @@ #if QT_CONFIG(evr) #include "directshowevrvideowindowcontrol.h" +#else +#include <mmreg.h> #endif #include "qmediacontent.h" @@ -113,7 +115,7 @@ public: } protected: - void run() { m_service->run(); } + void run() override { m_service->run(); } private: DirectShowPlayerService *m_service; @@ -217,11 +219,13 @@ QMediaControl *DirectShowPlayerService::requestControl(const char *name) IBaseFilter *filter; #if QT_CONFIG(evr) - DirectShowEvrVideoWindowControl *evrControl = new DirectShowEvrVideoWindowControl; - if ((filter = evrControl->filter())) - m_videoWindowControl = evrControl; - else - delete evrControl; + if (!qgetenv("QT_DIRECTSHOW_NO_EVR").toInt()) { + DirectShowEvrVideoWindowControl *evrControl = new DirectShowEvrVideoWindowControl; + if ((filter = evrControl->filter())) + m_videoWindowControl = evrControl; + else + delete evrControl; + } #endif // Fall back to the VMR9 if the EVR is not available if (!m_videoWindowControl) { @@ -1092,9 +1096,9 @@ qint64 DirectShowPlayerService::position() const QMutexLocker locker(const_cast<QMutex *>(&m_mutex)); if (m_graphStatus == Loaded) { - if (m_executingTask == Seek || m_executingTask == SetRate || (m_pendingTasks & Seek)) { + if (m_executingTask == Seek || m_executingTask == SetRate || (m_pendingTasks & Seek)) return m_position; - } else if (IMediaSeeking *seeking = com_cast<IMediaSeeking>(m_graph, IID_IMediaSeeking)) { + if (IMediaSeeking *seeking = com_cast<IMediaSeeking>(m_graph, IID_IMediaSeeking)) { LONGLONG position = 0; seeking->GetCurrentPosition(&position); @@ -1113,9 +1117,9 @@ QMediaTimeRange DirectShowPlayerService::availablePlaybackRanges() const QMutexLocker locker(const_cast<QMutex *>(&m_mutex)); if (m_graphStatus == Loaded) { - if (m_executingTask == Seek || m_executingTask == SetRate || (m_pendingTasks & Seek)) { + if (m_executingTask == Seek || m_executingTask == SetRate || (m_pendingTasks & Seek)) return m_playbackRange; - } else if (IMediaSeeking *seeking = com_cast<IMediaSeeking>(m_graph, IID_IMediaSeeking)) { + if (IMediaSeeking *seeking = com_cast<IMediaSeeking>(m_graph, IID_IMediaSeeking)) { LONGLONG minimum = 0; LONGLONG maximum = 0; @@ -1196,9 +1200,8 @@ int DirectShowPlayerService::bufferStatus() const reader->Release(); return percentage; - } else { - return 0; } + return 0; #else return 0; #endif diff --git a/src/plugins/directshow/player/directshowplayerservice.h b/src/plugins/directshow/player/directshowplayerservice.h index 01d05449e..4a9e25678 100644 --- a/src/plugins/directshow/player/directshowplayerservice.h +++ b/src/plugins/directshow/player/directshowplayerservice.h @@ -79,10 +79,10 @@ public: }; DirectShowPlayerService(QObject *parent = 0); - ~DirectShowPlayerService(); + ~DirectShowPlayerService() override; - QMediaControl* requestControl(const char *name); - void releaseControl(QMediaControl *control); + QMediaControl *requestControl(const char *name) override; + void releaseControl(QMediaControl *control) override; void load(const QMediaContent &media, QIODevice *stream); void play(); @@ -101,7 +101,7 @@ public: void setVideoOutput(IBaseFilter *filter); protected: - void customEvent(QEvent *event); + void customEvent(QEvent *event) override; private Q_SLOTS: void videoOutputChanged(); diff --git a/src/plugins/directshow/player/directshowvideorenderercontrol.cpp b/src/plugins/directshow/player/directshowvideorenderercontrol.cpp index ee7f5ec9e..88b5a51eb 100644 --- a/src/plugins/directshow/player/directshowvideorenderercontrol.cpp +++ b/src/plugins/directshow/player/directshowvideorenderercontrol.cpp @@ -98,13 +98,15 @@ void DirectShowVideoRendererControl::setSurface(QAbstractVideoSurface *surface) if (m_surface) { #if QT_CONFIG(evr) - m_filter = com_new<IBaseFilter>(clsid_EnhancedVideoRenderer); - m_evrPresenter = new EVRCustomPresenter(m_surface); - if (!m_evrPresenter->isValid() || !qt_evr_setCustomPresenter(m_filter, m_evrPresenter)) { - m_filter->Release(); - m_filter = 0; - m_evrPresenter->Release(); - m_evrPresenter = 0; + if (!qgetenv("QT_DIRECTSHOW_NO_EVR").toInt()) { + m_filter = com_new<IBaseFilter>(clsid_EnhancedVideoRenderer); + m_evrPresenter = new EVRCustomPresenter(m_surface); + if (!m_evrPresenter->isValid() || !qt_evr_setCustomPresenter(m_filter, m_evrPresenter)) { + m_filter->Release(); + m_filter = 0; + m_evrPresenter->Release(); + m_evrPresenter = 0; + } } if (!m_filter) diff --git a/src/plugins/directshow/player/directshowvideorenderercontrol.h b/src/plugins/directshow/player/directshowvideorenderercontrol.h index ce515a329..b2abeeaed 100644 --- a/src/plugins/directshow/player/directshowvideorenderercontrol.h +++ b/src/plugins/directshow/player/directshowvideorenderercontrol.h @@ -59,10 +59,10 @@ class DirectShowVideoRendererControl : public QVideoRendererControl Q_OBJECT public: DirectShowVideoRendererControl(DirectShowEventLoop *loop, QObject *parent = 0); - ~DirectShowVideoRendererControl(); + ~DirectShowVideoRendererControl() override; - QAbstractVideoSurface *surface() const; - void setSurface(QAbstractVideoSurface *surface); + QAbstractVideoSurface *surface() const override; + void setSurface(QAbstractVideoSurface *surface) override; IBaseFilter *filter(); diff --git a/src/plugins/directshow/player/player.pri b/src/plugins/directshow/player/player.pri index 9111cc545..ec1066db7 100644 --- a/src/plugins/directshow/player/player.pri +++ b/src/plugins/directshow/player/player.pri @@ -37,6 +37,8 @@ qtConfig(evr) { SOURCES += \ $$PWD/directshowevrvideowindowcontrol.cpp +} else { + LIBS += -lwinmm } qtConfig(wshellitem): \ diff --git a/src/plugins/directshow/player/videosurfacefilter.cpp b/src/plugins/directshow/player/videosurfacefilter.cpp index c521a251b..826d26bdb 100644 --- a/src/plugins/directshow/player/videosurfacefilter.cpp +++ b/src/plugins/directshow/player/videosurfacefilter.cpp @@ -330,12 +330,11 @@ bool VideoSurfaceFilter::setMediaType(const AM_MEDIA_TYPE *type) m_surfaceFormat = QVideoSurfaceFormat(); m_bytesPerLine = 0; return true; - } else { - m_surfaceFormat = DirectShowMediaType::videoFormatFromType(type); - m_bytesPerLine = DirectShowMediaType::bytesPerLine(m_surfaceFormat); - qCDebug(qLcRenderFilter) << "setMediaType -->" << m_surfaceFormat; - return m_surfaceFormat.isValid(); } + m_surfaceFormat = DirectShowMediaType::videoFormatFromType(type); + m_bytesPerLine = DirectShowMediaType::bytesPerLine(m_surfaceFormat); + qCDebug(qLcRenderFilter) << "setMediaType -->" << m_surfaceFormat; + return m_surfaceFormat.isValid(); } HRESULT VideoSurfaceFilter::completeConnection(IPin *pin) @@ -344,10 +343,7 @@ HRESULT VideoSurfaceFilter::completeConnection(IPin *pin) qCDebug(qLcRenderFilter, "completeConnection"); - if (!startSurface()) - return VFW_E_TYPE_NOT_ACCEPTED; - else - return S_OK; + return startSurface() ? S_OK : VFW_E_TYPE_NOT_ACCEPTED; } HRESULT VideoSurfaceFilter::connectionEnded() @@ -783,32 +779,40 @@ void VideoSurfaceFilter::renderPendingSample() bool VideoSurfaceFilter::event(QEvent *e) { - if (e->type() == QEvent::Type(StartSurface)) { + switch (e->type()) { + case StartSurface: { QMutexLocker locker(&m_mutex); startSurface(); m_waitSurface.wakeAll(); return true; - } else if (e->type() == QEvent::Type(StopSurface)) { + } + case StopSurface: { QMutexLocker locker(&m_mutex); stopSurface(); m_waitSurface.wakeAll(); return true; - } else if (e->type() == QEvent::Type(RestartSurface)) { + } + case RestartSurface: { QMutexLocker locker(&m_mutex); restartSurface(); m_waitSurface.wakeAll(); return true; - } else if (e->type() == QEvent::Type(FlushSurface)) { + } + case FlushSurface: { QMutexLocker locker(&m_mutex); flushSurface(); m_waitSurface.wakeAll(); return true; - } else if (e->type() == QEvent::Type(RenderSample)) { + } + case RenderSample: { QMutexLocker locker(&m_mutex); renderPendingSample(); m_waitSurface.wakeAll(); return true; } + default: + break; + } return QObject::event(e); } diff --git a/src/plugins/directshow/player/vmr9videowindowcontrol.h b/src/plugins/directshow/player/vmr9videowindowcontrol.h index ed3b53233..8ab9bd506 100644 --- a/src/plugins/directshow/player/vmr9videowindowcontrol.h +++ b/src/plugins/directshow/player/vmr9videowindowcontrol.h @@ -53,37 +53,37 @@ class Vmr9VideoWindowControl : public QVideoWindowControl Q_OBJECT public: Vmr9VideoWindowControl(QObject *parent = 0); - ~Vmr9VideoWindowControl(); + ~Vmr9VideoWindowControl() override; IBaseFilter *filter() const { return m_filter; } - WId winId() const; - void setWinId(WId id); + WId winId() const override; + void setWinId(WId id) override; - QRect displayRect() const; - void setDisplayRect(const QRect &rect); + QRect displayRect() const override; + void setDisplayRect(const QRect &rect) override; - bool isFullScreen() const; - void setFullScreen(bool fullScreen); + bool isFullScreen() const override; + void setFullScreen(bool fullScreen) override; - void repaint(); + void repaint() override; - QSize nativeSize() const; + QSize nativeSize() const override; - Qt::AspectRatioMode aspectRatioMode() const; - void setAspectRatioMode(Qt::AspectRatioMode mode); + Qt::AspectRatioMode aspectRatioMode() const override; + void setAspectRatioMode(Qt::AspectRatioMode mode) override; - int brightness() const; - void setBrightness(int brightness); + int brightness() const override; + void setBrightness(int brightness) override; - int contrast() const; - void setContrast(int contrast); + int contrast() const override; + void setContrast(int contrast) override; - int hue() const; - void setHue(int hue); + int hue() const override; + void setHue(int hue) override; - int saturation() const; - void setSaturation(int saturation); + int saturation() const override; + void setSaturation(int saturation) override; private: void setProcAmpValues(); |