diff options
author | Tarja Sundqvist <tarja.sundqvist@qt.io> | 2023-10-11 16:01:38 +0300 |
---|---|---|
committer | Tarja Sundqvist <tarja.sundqvist@qt.io> | 2023-10-11 16:01:38 +0300 |
commit | 5197ff9e91cabd90700cf0d36fb5e9e5793d7097 (patch) | |
tree | a71216735b7bb482012d51eda9f6d0b26da54097 | |
parent | b4d58d8921d6d1c937b5e708e257e2a07a0c5dc4 (diff) | |
parent | 569d91d8560620d697dd8cc7c49581c7ff70b8ce (diff) |
Merge remote-tracking branch 'origin/tqtc/lts-5.15.12' into tqtc/lts-5.15-opensourcev5.15.12-lts-lgpl
Change-Id: I6a330e383bb573bd7ba6cfea7e8bce3e88de2d7a
-rw-r--r-- | .qmake.conf | 2 | ||||
-rw-r--r-- | src/plugins/avfoundation/camera/avfcameraflashcontrol.mm | 26 | ||||
-rw-r--r-- | src/plugins/common/evr/evrcustompresenter.cpp | 36 | ||||
-rw-r--r-- | src/plugins/common/evr/evrcustompresenter.h | 3 | ||||
-rw-r--r-- | src/plugins/common/evr/evrd3dpresentengine.cpp | 7 | ||||
-rw-r--r-- | src/plugins/common/evr/evrd3dpresentengine.h | 3 | ||||
-rw-r--r-- | src/plugins/common/evr/evrvideowindowcontrol.cpp | 24 | ||||
-rw-r--r-- | src/plugins/common/evr/evrvideowindowcontrol.h | 3 | ||||
-rw-r--r-- | src/plugins/wmf/player/mfplayersession.cpp | 7 | ||||
-rw-r--r-- | src/plugins/wmf/player/mfvideorenderercontrol.cpp | 24 | ||||
-rw-r--r-- | src/plugins/wmf/player/mfvideorenderercontrol.h | 5 | ||||
-rw-r--r-- | src/qtmultimediaquicktools/qdeclarativevideooutput.cpp | 9 |
12 files changed, 120 insertions, 29 deletions
diff --git a/.qmake.conf b/.qmake.conf index 259b036a0..0b51738b3 100644 --- a/.qmake.conf +++ b/.qmake.conf @@ -2,4 +2,4 @@ load(qt_build_config) DEFINES += QT_NO_FOREACH QT_NO_JAVA_STYLE_ITERATORS QT_NO_LINKED_LIST -MODULE_VERSION = 5.15.11 +MODULE_VERSION = 5.15.12 diff --git a/src/plugins/avfoundation/camera/avfcameraflashcontrol.mm b/src/plugins/avfoundation/camera/avfcameraflashcontrol.mm index 42303ce17..1e27dc472 100644 --- a/src/plugins/avfoundation/camera/avfcameraflashcontrol.mm +++ b/src/plugins/avfoundation/camera/avfcameraflashcontrol.mm @@ -171,6 +171,20 @@ bool AVFCameraFlashControl::applyFlashSettings() return false; } + auto setAvTorchModeSafe = [&captureDevice](AVCaptureTorchMode avTorchMode) { + if ([captureDevice isTorchModeSupported:avTorchMode]) + captureDevice.torchMode = avTorchMode; + else + qDebugCamera() << Q_FUNC_INFO << "Attempt to setup unsupported torch mode " << avTorchMode; + }; + + auto setAvFlashModeSafe = [&captureDevice](AVCaptureFlashMode avFlashMode) { + if ([captureDevice isFlashModeSupported:avFlashMode]) + captureDevice.flashMode = avFlashMode; + else + qDebugCamera() << Q_FUNC_INFO << "Attempt to setup unsupported flash mode " << avFlashMode; + }; + if (!isFlashModeSupported(m_flashMode)) { qDebugCamera() << Q_FUNC_INFO << "unsupported mode" << m_flashMode; return false; @@ -192,7 +206,7 @@ bool AVFCameraFlashControl::applyFlashSettings() return false; } #endif - captureDevice.torchMode = AVCaptureTorchModeOff; + setAvTorchModeSafe(AVCaptureTorchModeOff); } #ifdef Q_OS_IOS if (![captureDevice isFlashAvailable]) { @@ -209,7 +223,7 @@ bool AVFCameraFlashControl::applyFlashSettings() return false; } #endif - captureDevice.flashMode = AVCaptureFlashModeOff; + setAvFlashModeSafe(AVCaptureFlashModeOff); } #ifdef Q_OS_IOS @@ -221,13 +235,13 @@ bool AVFCameraFlashControl::applyFlashSettings() } if (m_flashMode == QCameraExposure::FlashOff) - captureDevice.flashMode = AVCaptureFlashModeOff; + setAvFlashModeSafe(AVCaptureFlashModeOff); else if (m_flashMode == QCameraExposure::FlashOn) - captureDevice.flashMode = AVCaptureFlashModeOn; + setAvFlashModeSafe(AVCaptureFlashModeOn); else if (m_flashMode == QCameraExposure::FlashAuto) - captureDevice.flashMode = AVCaptureFlashModeAuto; + setAvFlashModeSafe(AVCaptureFlashModeAuto); else if (m_flashMode == QCameraExposure::FlashVideoLight) - captureDevice.torchMode = AVCaptureTorchModeOn; + setAvTorchModeSafe(AVCaptureTorchModeOn); return true; } diff --git a/src/plugins/common/evr/evrcustompresenter.cpp b/src/plugins/common/evr/evrcustompresenter.cpp index b2dd0426c..3405f6373 100644 --- a/src/plugins/common/evr/evrcustompresenter.cpp +++ b/src/plugins/common/evr/evrcustompresenter.cpp @@ -1065,6 +1065,13 @@ void EVRCustomPresenter::setSurface(QAbstractVideoSurface *surface) supportedFormatsChanged(); } +void EVRCustomPresenter::setCropRect(QRect cropRect) +{ + m_mutex.lock(); + m_cropRect = cropRect; + m_mutex.unlock(); +} + HRESULT EVRCustomPresenter::configureMixer(IMFTransform *mixer) { // Set the zoom rectangle (ie, the source clipping rectangle). @@ -1355,13 +1362,30 @@ HRESULT EVRCustomPresenter::createOptimalVideoType(IMFMediaType *proposedType, I hr = proposedType->GetUINT64(MF_MT_FRAME_SIZE, &size); width = int(HI32(size)); height = int(LO32(size)); - rcOutput.left = 0; - rcOutput.top = 0; - rcOutput.right = width; - rcOutput.bottom = height; + + if (m_cropRect.isValid()) { + rcOutput.left = m_cropRect.x(); + rcOutput.top = m_cropRect.y(); + rcOutput.right = m_cropRect.x() + m_cropRect.width(); + rcOutput.bottom = m_cropRect.y() + m_cropRect.height(); + + m_sourceRect.left = float(m_cropRect.x()) / width; + m_sourceRect.top = float(m_cropRect.y()) / height; + m_sourceRect.right = float(m_cropRect.x() + m_cropRect.width()) / width; + m_sourceRect.bottom = float(m_cropRect.y() + m_cropRect.height()) / height; + + if (m_mixer) + configureMixer(m_mixer); + } else { + rcOutput.left = 0; + rcOutput.top = 0; + rcOutput.right = width; + rcOutput.bottom = height; + } // Set the geometric aperture, and disable pan/scan. - displayArea = qt_evr_makeMFArea(0, 0, rcOutput.right, rcOutput.bottom); + displayArea = qt_evr_makeMFArea(0, 0, rcOutput.right - rcOutput.left, + rcOutput.bottom - rcOutput.top); hr = mtOptimal->SetUINT32(MF_MT_PAN_SCAN_ENABLED, FALSE); if (FAILED(hr)) @@ -1427,7 +1451,7 @@ HRESULT EVRCustomPresenter::setMediaType(IMFMediaType *mediaType) // Initialize the presenter engine with the new media type. // The presenter engine allocates the samples. - hr = m_presentEngine->createVideoSamples(mediaType, sampleQueue); + hr = m_presentEngine->createVideoSamples(mediaType, sampleQueue, m_cropRect.size()); if (FAILED(hr)) goto done; diff --git a/src/plugins/common/evr/evrcustompresenter.h b/src/plugins/common/evr/evrcustompresenter.h index c1c21580e..403158619 100644 --- a/src/plugins/common/evr/evrcustompresenter.h +++ b/src/plugins/common/evr/evrcustompresenter.h @@ -44,6 +44,7 @@ #include <qmutex.h> #include <qqueue.h> #include <qevent.h> +#include <qrect.h> #include <qvideosurfaceformat.h> #include "evrdefs.h" @@ -257,6 +258,7 @@ public: void supportedFormatsChanged(); void setSurface(QAbstractVideoSurface *surface); + void setCropRect(QRect cropRect); void startSurface(); void stopSurface(); @@ -368,6 +370,7 @@ private: QAbstractVideoSurface *m_surface; bool m_canRenderToSurface; qint64 m_positionOffset; // Seek position in microseconds. + QRect m_cropRect; // Video crop rectangle }; bool qt_evr_setCustomPresenter(IUnknown *evr, EVRCustomPresenter *presenter); diff --git a/src/plugins/common/evr/evrd3dpresentengine.cpp b/src/plugins/common/evr/evrd3dpresentengine.cpp index d8e2da6d3..0bf8a0506 100644 --- a/src/plugins/common/evr/evrd3dpresentengine.cpp +++ b/src/plugins/common/evr/evrd3dpresentengine.cpp @@ -520,7 +520,7 @@ void D3DPresentEngine::setHint(Hint hint, bool enable) m_useTextureRendering = enable && supportsTextureRendering(); } -HRESULT D3DPresentEngine::createVideoSamples(IMFMediaType *format, QList<IMFSample*> &videoSampleQueue) +HRESULT D3DPresentEngine::createVideoSamples(IMFMediaType *format, QList<IMFSample*> &videoSampleQueue, QSize frameSize) { if (!format) return MF_E_UNEXPECTED; @@ -537,6 +537,11 @@ HRESULT D3DPresentEngine::createVideoSamples(IMFMediaType *format, QList<IMFSamp if (FAILED(hr)) return hr; + if (frameSize.isValid() && !frameSize.isEmpty()) { + width = frameSize.width(); + height = frameSize.height(); + } + DWORD d3dFormat = 0; hr = qt_evr_getFourCC(format, &d3dFormat); if (FAILED(hr)) diff --git a/src/plugins/common/evr/evrd3dpresentengine.h b/src/plugins/common/evr/evrd3dpresentengine.h index 8e2a444f3..d7eeacfc0 100644 --- a/src/plugins/common/evr/evrd3dpresentengine.h +++ b/src/plugins/common/evr/evrd3dpresentengine.h @@ -41,6 +41,7 @@ #define EVRD3DPRESENTENGINE_H #include <QMutex> +#include <QSize> #include <QVideoSurfaceFormat> #include <d3d9.h> @@ -120,7 +121,7 @@ public: bool supportsTextureRendering() const; bool isTextureRenderingEnabled() const { return m_useTextureRendering; } - HRESULT createVideoSamples(IMFMediaType *format, QList<IMFSample*>& videoSampleQueue); + HRESULT createVideoSamples(IMFMediaType *format, QList<IMFSample*>& videoSampleQueue, QSize frameSize); QVideoSurfaceFormat videoSurfaceFormat() const { return m_surfaceFormat; } QVideoFrame makeVideoFrame(IMFSample* sample); diff --git a/src/plugins/common/evr/evrvideowindowcontrol.cpp b/src/plugins/common/evr/evrvideowindowcontrol.cpp index 95f63c2e7..cec263da9 100644 --- a/src/plugins/common/evr/evrvideowindowcontrol.cpp +++ b/src/plugins/common/evr/evrvideowindowcontrol.cpp @@ -134,26 +134,29 @@ void EvrVideoWindowControl::setDisplayRect(const QRect &rect) if (m_displayControl) { RECT displayRect = { rect.left(), rect.top(), rect.right() + 1, rect.bottom() + 1 }; - QSize sourceSize = nativeSize(); + QSize fullSize = nativeSize(); - RECT sourceRect = { 0, 0, sourceSize.width(), sourceSize.height() }; + RECT sourceRect; + if (m_cropRect.isValid()) + sourceRect = { m_cropRect.x(), m_cropRect.y(), m_cropRect.right() + 1, m_cropRect.bottom() + 1 }; + else + sourceRect = { 0, 0, fullSize.width(), fullSize.height() }; if (m_aspectRatioMode == Qt::KeepAspectRatioByExpanding) { QSize clippedSize = rect.size(); clippedSize.scale(sourceRect.right, sourceRect.bottom, Qt::KeepAspectRatio); - sourceRect.left = (sourceRect.right - clippedSize.width()) / 2; sourceRect.top = (sourceRect.bottom - clippedSize.height()) / 2; sourceRect.right = sourceRect.left + clippedSize.width(); sourceRect.bottom = sourceRect.top + clippedSize.height(); } - if (sourceSize.width() > 0 && sourceSize.height() > 0) { + if (sourceRect.right - sourceRect.left > 0 && sourceRect.bottom - sourceRect.top > 0) { MFVideoNormalizedRect sourceNormRect; - sourceNormRect.left = float(sourceRect.left) / float(sourceRect.right); - sourceNormRect.top = float(sourceRect.top) / float(sourceRect.bottom); - sourceNormRect.right = float(sourceRect.right) / float(sourceRect.right); - sourceNormRect.bottom = float(sourceRect.bottom) / float(sourceRect.bottom); + sourceNormRect.left = float(sourceRect.left) / float(fullSize.width()); + sourceNormRect.top = float(sourceRect.top) / float(fullSize.height()); + sourceNormRect.right = float(sourceRect.right) / float(fullSize.width()); + sourceNormRect.bottom = float(sourceRect.bottom) / float(fullSize.height()); m_displayControl->SetVideoPosition(&sourceNormRect, &displayRect); } else { m_displayControl->SetVideoPosition(NULL, &displayRect); @@ -164,6 +167,11 @@ void EvrVideoWindowControl::setDisplayRect(const QRect &rect) } } +void EvrVideoWindowControl::setCropRect(QRect cropRect) +{ + m_cropRect = cropRect; +} + bool EvrVideoWindowControl::isFullScreen() const { return m_fullScreen; diff --git a/src/plugins/common/evr/evrvideowindowcontrol.h b/src/plugins/common/evr/evrvideowindowcontrol.h index ce3b7746f..49d111b99 100644 --- a/src/plugins/common/evr/evrvideowindowcontrol.h +++ b/src/plugins/common/evr/evrvideowindowcontrol.h @@ -85,6 +85,8 @@ public: void applyImageControls(); + void setCropRect(QRect cropRect); + private: void clear(); DXVA2_Fixed32 scaleProcAmpValue(DWORD prop, int value) const; @@ -94,6 +96,7 @@ private: DWORD m_dirtyValues; Qt::AspectRatioMode m_aspectRatioMode; QRect m_displayRect; + QRect m_cropRect; int m_brightness; int m_contrast; int m_hue; diff --git a/src/plugins/wmf/player/mfplayersession.cpp b/src/plugins/wmf/player/mfplayersession.cpp index 1d145edc4..daf6f801f 100644 --- a/src/plugins/wmf/player/mfplayersession.cpp +++ b/src/plugins/wmf/player/mfplayersession.cpp @@ -47,6 +47,7 @@ #include <QtCore/qdebug.h> #include <QtCore/qfile.h> #include <QtCore/qbuffer.h> +#include <QtMultimedia/qmediametadata.h> #include "mfplayercontrol.h" #include "mfevrvideowindowcontrol.h" @@ -428,9 +429,15 @@ IMFTopologyNode* MFPlayerSession::addOutputNode(MediaType mediaType, IMFTopology if (mediaType == Audio) { activate = m_playerService->audioEndpointControl()->createActivate(); } else if (mediaType == Video) { + + QSize resolution = m_playerService->metaDataControl()->metaData(QMediaMetaData::Resolution).toSize(); + QRect cropRect = QRect(QPoint(), resolution); + if (m_playerService->videoRendererControl()) { + m_playerService->videoRendererControl()->setCropRect(cropRect); activate = m_playerService->videoRendererControl()->createActivate(); } else if (m_playerService->videoWindowControl()) { + m_playerService->videoWindowControl()->setCropRect(cropRect); activate = m_playerService->videoWindowControl()->createActivate(); } else { qWarning() << "no videoWindowControl or videoRendererControl, unable to add output node for video data"; diff --git a/src/plugins/wmf/player/mfvideorenderercontrol.cpp b/src/plugins/wmf/player/mfvideorenderercontrol.cpp index 94d5f68be..38455090b 100644 --- a/src/plugins/wmf/player/mfvideorenderercontrol.cpp +++ b/src/plugins/wmf/player/mfvideorenderercontrol.cpp @@ -2239,10 +2239,12 @@ public: STDMETHODIMP DetachObject(); void setSurface(QAbstractVideoSurface *surface); + void setCropRect(QRect cropRect); private: EVRCustomPresenter *m_presenter; QAbstractVideoSurface *m_surface; + QRect m_cropRect; QMutex m_mutex; }; @@ -2305,6 +2307,14 @@ void MFVideoRendererControl::setSurface(QAbstractVideoSurface *surface) static_cast<VideoRendererActivate*>(m_currentActivate)->setSurface(m_surface); } +void MFVideoRendererControl::setCropRect(QRect cropRect) +{ + m_cropRect = cropRect; + + if (m_presenterActivate) + m_presenterActivate->setCropRect(cropRect); +} + void MFVideoRendererControl::customEvent(QEvent *event) { if (m_presenterActivate) @@ -2365,6 +2375,7 @@ IMFActivate* MFVideoRendererControl::createActivate() if (SUCCEEDED(MFCreateVideoRendererActivate(::GetShellWindow(), &m_currentActivate))) { m_presenterActivate = new EVRCustomPresenterActivate; m_currentActivate->SetUnknown(MF_ACTIVATE_CUSTOM_VIDEO_PRESENTER_ACTIVATE, m_presenterActivate); + m_presenterActivate->setCropRect(m_cropRect); } else { m_currentActivate = new VideoRendererActivate(this); } @@ -2388,6 +2399,7 @@ HRESULT EVRCustomPresenterActivate::ActivateObject(REFIID riid, void **ppv) QMutexLocker locker(&m_mutex); if (!m_presenter) { m_presenter = new EVRCustomPresenter; + m_presenter->setCropRect(m_cropRect); if (m_surface) m_presenter->setSurface(m_surface); } @@ -2423,5 +2435,17 @@ void EVRCustomPresenterActivate::setSurface(QAbstractVideoSurface *surface) m_presenter->setSurface(surface); } +void EVRCustomPresenterActivate::setCropRect(QRect cropRect) +{ + QMutexLocker locker(&m_mutex); + if (m_cropRect == cropRect) + return; + + m_cropRect = cropRect; + + if (m_presenter) + m_presenter->setCropRect(cropRect); +} + #include "moc_mfvideorenderercontrol.cpp" #include "mfvideorenderercontrol.moc" diff --git a/src/plugins/wmf/player/mfvideorenderercontrol.h b/src/plugins/wmf/player/mfvideorenderercontrol.h index da9e97ba9..8eab19b40 100644 --- a/src/plugins/wmf/player/mfvideorenderercontrol.h +++ b/src/plugins/wmf/player/mfvideorenderercontrol.h @@ -43,6 +43,7 @@ #include "qvideorenderercontrol.h" #include <mfapi.h> #include <mfidl.h> +#include <qrect.h> QT_USE_NAMESPACE @@ -61,6 +62,8 @@ public: IMFActivate* createActivate(); void releaseActivate(); + void setCropRect(QRect cropRect); + protected: void customEvent(QEvent *event); @@ -74,8 +77,8 @@ private: QAbstractVideoSurface *m_surface; IMFActivate *m_currentActivate; IMFSampleGrabberSinkCallback *m_callback; - EVRCustomPresenterActivate *m_presenterActivate; + QRect m_cropRect; }; #endif diff --git a/src/qtmultimediaquicktools/qdeclarativevideooutput.cpp b/src/qtmultimediaquicktools/qdeclarativevideooutput.cpp index ca3a4b2ea..a948a5218 100644 --- a/src/qtmultimediaquicktools/qdeclarativevideooutput.cpp +++ b/src/qtmultimediaquicktools/qdeclarativevideooutput.cpp @@ -374,6 +374,8 @@ void QDeclarativeVideoOutput::_q_updateNativeSize() if (!m_backend) return; + m_geometryDirty = true; + QSize size = m_backend->nativeSize(); if (!qIsDefaultAspect(m_orientation)) { size.transpose(); @@ -382,8 +384,6 @@ void QDeclarativeVideoOutput::_q_updateNativeSize() if (m_nativeSize != size) { m_nativeSize = size; - m_geometryDirty = true; - setImplicitWidth(size.width()); setImplicitHeight(size.height()); @@ -421,9 +421,8 @@ void QDeclarativeVideoOutput::_q_updateGeometry() } if (m_backend) { - if (!m_backend->videoSurface() || m_backend->videoSurface()->isActive()) - m_backend->updateGeometry(); - else + m_backend->updateGeometry(); + if (m_backend->videoSurface() && !m_backend->videoSurface()->isActive()) m_geometryDirty = true; } |