summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2021-04-16 16:03:20 +0200
committerLars Knoll <lars.knoll@qt.io>2021-04-19 11:09:52 +0000
commit17209c562e1e7b86727c21d2851218c6dbecfc1e (patch)
treedb3ccc6c9f826accf04b7587913627cfa78c7e2d
parenta98f5f2a1f38421da7e5c74b4009a4ef0a2cb79c (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>
-rw-r--r--src/imports/multimedia/qmldir1
-rw-r--r--src/multimedia/platform/darwin/avfvideosink_p.h2
-rw-r--r--src/multimedia/platform/darwin/camera/avfcamera.mm41
-rw-r--r--src/multimedia/platform/darwin/camera/avfcamerarenderer.mm8
-rw-r--r--src/multimedia/platform/darwin/camera/avfcamerarenderer_p.h4
-rw-r--r--src/multimedia/platform/darwin/mediaplayer/avfmediaplayer.mm6
-rw-r--r--src/multimedia/platform/darwin/mediaplayer/avfmediaplayer_p.h6
-rw-r--r--src/multimedia/platform/darwin/mediaplayer/avfvideorenderercontrol.mm1
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>