diff options
author | Lars Knoll <lars.knoll@qt.io> | 2021-04-16 16:03:20 +0200 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2021-04-19 11:09:52 +0000 |
commit | 17209c562e1e7b86727c21d2851218c6dbecfc1e (patch) | |
tree | db3ccc6c9f826accf04b7587913627cfa78c7e2d | |
parent | a98f5f2a1f38421da7e5c74b4009a4ef0a2cb79c (diff) |
Fix camera and compilation on macOS
Follow up after the previous changes and make sure
things compile and work again on macOS.
Change-Id: I7415899eb84a788b8afa26fce7ec889301ce466a
Reviewed-by: Doris Verria <doris.verria@qt.io>
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
8 files changed, 38 insertions, 31 deletions
diff --git a/src/imports/multimedia/qmldir b/src/imports/multimedia/qmldir index 387cb3c14..028587088 100644 --- a/src/imports/multimedia/qmldir +++ b/src/imports/multimedia/qmldir @@ -4,4 +4,3 @@ classname QMultimediaDeclarativeModule typeinfo plugins.qmltypes prefer :/qt-project.org/imports/QtMultimedia/ Video 5.0 Video.qml - diff --git a/src/multimedia/platform/darwin/avfvideosink_p.h b/src/multimedia/platform/darwin/avfvideosink_p.h index 220769ffc..b69e538cd 100644 --- a/src/multimedia/platform/darwin/avfvideosink_p.h +++ b/src/multimedia/platform/darwin/avfvideosink_p.h @@ -131,7 +131,7 @@ public: virtual void reconfigure() = 0; virtual void updateAspectRatio() = 0; - virtual void setRhi(QRhi *) { Q_ASSERT(false); } + virtual void setRhi(QRhi *) = 0; void setLayer(CALayer *layer); diff --git a/src/multimedia/platform/darwin/camera/avfcamera.mm b/src/multimedia/platform/darwin/camera/avfcamera.mm index a236d8de7..e6fc4bf3b 100644 --- a/src/multimedia/platform/darwin/camera/avfcamera.mm +++ b/src/multimedia/platform/darwin/camera/avfcamera.mm @@ -56,15 +56,6 @@ AVFCamera::AVFCamera(QCamera *camera) , m_lastStatus(QCamera::InactiveStatus) { Q_ASSERT(camera); - Q_ASSERT(camera->captureSession()); - - m_service = static_cast<AVFCameraService *>(camera->captureSession()->platformSession()); - Q_ASSERT(m_service); - - m_session = m_service->session(); - Q_ASSERT(m_session); - - setCamera(camera->cameraInfo()); m_cameraFocusControl = new AVFCameraFocus(this); m_cameraImageProcessingControl = new AVFCameraImageProcessing(this); @@ -72,7 +63,6 @@ AVFCamera::AVFCamera(QCamera *camera) #ifdef Q_OS_IOS m_cameraExposureControl = new AVFCameraExposure(this); #endif - connect(m_session, SIGNAL(activeChanged(bool)), SLOT(updateStatus())); } AVFCamera::~AVFCamera() @@ -92,7 +82,8 @@ void AVFCamera::setActive(bool active) if (m_active == active) return; m_active = active; - m_session->setActive(active); + if (m_session) + m_session->setActive(active); Q_EMIT activeChanged(m_active); updateStatus(); @@ -100,11 +91,14 @@ void AVFCamera::setActive(bool active) QCamera::Status AVFCamera::status() const { - static QCamera::Status statusTable[2][2] = { + static const QCamera::Status statusTable[2][2] = { { QCamera::InactiveStatus, QCamera::StoppingStatus }, //Inactive state { QCamera::StartingStatus, QCamera::ActiveStatus } //ActiveState }; + if (!m_session) + return QCamera::InactiveStatus; + return statusTable[m_active ? 1 : 0][m_session->isActive() ? 1 : 0]; } @@ -113,7 +107,8 @@ void AVFCamera::setCamera(const QCameraInfo &camera) if (m_cameraInfo == camera) return; m_cameraInfo = camera; - m_session->setActiveCamera(camera); + if (m_session) + m_session->setActiveCamera(camera); } void AVFCamera::setCaptureSession(QPlatformMediaCaptureSession *session) @@ -122,16 +117,20 @@ void AVFCamera::setCaptureSession(QPlatformMediaCaptureSession *session) if (m_service == captureSession) return; - if (m_session) { - m_session->setActiveCamera(QCameraInfo()); + m_service = captureSession; + if (!m_service) { m_session = nullptr; + return; } - m_service = captureSession; - if (m_service) { - m_session = m_service->session(); - m_session->setActiveCamera(m_cameraInfo); - } + m_session = m_service->session(); + Q_ASSERT(m_session); + connect(m_session, SIGNAL(activeChanged(bool)), SLOT(updateStatus())); + + m_session->setActiveCamera(QCameraInfo()); + m_session->setActive(m_active); + m_session->setActiveCamera(m_cameraInfo); + captureSessionChanged(); } @@ -148,7 +147,7 @@ void AVFCamera::updateStatus() AVCaptureConnection *AVFCamera::videoConnection() const { - if (!m_session->videoOutput() || !m_session->videoOutput()->videoDataOutput()) + if (!m_session || !m_session->videoOutput() || !m_session->videoOutput()->videoDataOutput()) return nil; return [m_session->videoOutput()->videoDataOutput() connectionWithMediaType:AVMediaTypeVideo]; diff --git a/src/multimedia/platform/darwin/camera/avfcamerarenderer.mm b/src/multimedia/platform/darwin/camera/avfcamerarenderer.mm index ab0e3b503..a3b4cc95a 100644 --- a/src/multimedia/platform/darwin/camera/avfcamerarenderer.mm +++ b/src/multimedia/platform/darwin/camera/avfcamerarenderer.mm @@ -103,7 +103,7 @@ QT_USE_NAMESPACE if (format == QVideoFrameFormat::Format_Invalid) return; - QVideoFrame frame(new AVFVideoBuffer(nullptr, imageBuffer), + QVideoFrame frame(new AVFVideoBuffer(m_renderer->rhi(), imageBuffer), QVideoFrameFormat(QSize(width, height), format)); m_renderer->syncHandleViewfinderFrame(frame); @@ -256,4 +256,10 @@ void AVFCameraRenderer::updateAspectRatio() layer.videoGravity = gravity; } +void AVFCameraRenderer::setRhi(QRhi *rhi) +{ + m_rhi = rhi; +} + #include "moc_avfcamerarenderer_p.cpp" + diff --git a/src/multimedia/platform/darwin/camera/avfcamerarenderer_p.h b/src/multimedia/platform/darwin/camera/avfcamerarenderer_p.h index b993ec144..b60053e3c 100644 --- a/src/multimedia/platform/darwin/camera/avfcamerarenderer_p.h +++ b/src/multimedia/platform/darwin/camera/avfcamerarenderer_p.h @@ -77,6 +77,7 @@ public: void reconfigure() override; void updateAspectRatio() override; + void setRhi(QRhi *rhi) override; void configureAVCaptureSession(AVFCameraSession *cameraSession); void syncHandleViewfinderFrame(const QVideoFrame &frame); @@ -88,6 +89,8 @@ public: AVFCaptureFramesDelegate *captureDelegate() const; void resetCaptureDelegate() const; + QRhi *rhi() const { return m_rhi; } + private Q_SLOTS: void handleViewfinderFrame(); void updateCaptureConnection(); @@ -108,6 +111,7 @@ private: QMutex m_vfMutex; bool m_rendersToWindow = false; dispatch_queue_t m_delegateQueue; + QRhi *m_rhi = nullptr; friend class CVImageVideoBuffer; }; diff --git a/src/multimedia/platform/darwin/mediaplayer/avfmediaplayer.mm b/src/multimedia/platform/darwin/mediaplayer/avfmediaplayer.mm index 5f4da2d04..f701bdf50 100644 --- a/src/multimedia/platform/darwin/mediaplayer/avfmediaplayer.mm +++ b/src/multimedia/platform/darwin/mediaplayer/avfmediaplayer.mm @@ -547,7 +547,7 @@ AVAsset *AVFMediaPlayer::currentAssetHandle() return currentAsset; } -QMediaPlayer::State AVFMediaPlayer::state() const +QMediaPlayer::PlaybackState AVFMediaPlayer::state() const { return m_state; } @@ -597,7 +597,7 @@ void AVFMediaPlayer::setMedia(const QUrl &content, QIODevice *stream) Q_EMIT positionChanged(position()); const QMediaPlayer::MediaStatus oldMediaStatus = m_mediaStatus; - const QMediaPlayer::State oldState = m_state; + const QMediaPlayer::PlaybackState oldState = m_state; if (!m_mediaStream && content.isEmpty()) { m_mediaStatus = QMediaPlayer::NoMedia; @@ -950,7 +950,7 @@ void AVFMediaPlayer::processEOS() Q_EMIT stateChanged(m_state); } -void AVFMediaPlayer::processLoadStateChange(QMediaPlayer::State newState) +void AVFMediaPlayer::processLoadStateChange(QMediaPlayer::PlaybackState newState) { AVPlayerStatus currentStatus = [[static_cast<AVFMediaPlayerObserver*>(m_observer) player] status]; diff --git a/src/multimedia/platform/darwin/mediaplayer/avfmediaplayer_p.h b/src/multimedia/platform/darwin/mediaplayer/avfmediaplayer_p.h index eeb372165..686d2ea11 100644 --- a/src/multimedia/platform/darwin/mediaplayer/avfmediaplayer_p.h +++ b/src/multimedia/platform/darwin/mediaplayer/avfmediaplayer_p.h @@ -81,7 +81,7 @@ public: void setVideoOutput(AVFVideoRendererControl *output); AVAsset *currentAssetHandle(); - QMediaPlayer::State state() const override; + QMediaPlayer::PlaybackState state() const override; QMediaPlayer::MediaStatus mediaStatus() const override; QUrl media() const override; @@ -122,7 +122,7 @@ public Q_SLOTS: void setMuted(bool muted) override; void processEOS(); - void processLoadStateChange(QMediaPlayer::State newState); + void processLoadStateChange(QMediaPlayer::PlaybackState newState); void processPositionChange(); void processMediaLoadError(); @@ -154,7 +154,7 @@ private: AVFVideoRendererControl *m_videoOutput = nullptr; AVFVideoSink *m_videoSink = nullptr; - QMediaPlayer::State m_state; + QMediaPlayer::PlaybackState m_state; QMediaPlayer::MediaStatus m_mediaStatus; QIODevice *m_mediaStream; QUrl m_resources; diff --git a/src/multimedia/platform/darwin/mediaplayer/avfvideorenderercontrol.mm b/src/multimedia/platform/darwin/mediaplayer/avfvideorenderercontrol.mm index 10e4f1bab..a1b4b17cb 100644 --- a/src/multimedia/platform/darwin/mediaplayer/avfvideorenderercontrol.mm +++ b/src/multimedia/platform/darwin/mediaplayer/avfvideorenderercontrol.mm @@ -44,7 +44,6 @@ #include <private/qabstractvideobuffer_p.h> #include <QtMultimedia/qvideoframeformat.h> -#include <private/qimagevideobuffer_p.h> #include <private/avfvideosink_p.h> #include <QtGui/private/qrhi_p.h> |