summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDoris Verria <doris.verria@qt.io>2021-03-19 15:41:25 +0100
committerLars Knoll <lars.knoll@qt.io>2021-04-06 08:11:09 +0000
commit4afad05b6034d0764f645601e5c59f192055af38 (patch)
tree13aff5f6fcd5833d219e32b0973101692a43c7c3
parentf0333fe76695508b131a96f0de2589a8719e1546 (diff)
Don't add cameraControl and imageCaptureControl on session initialization
Add API for adding and relasing a session's cameraControl and imageCaptureControl. The session is audio-only until attaching a camera to it, so initialize the cameraControl on addCamera(). Do the same for the imageCaptureControl. Still need to change for other platforms besides darwin. To be followed by changes in the mediaEncoder too. Change-Id: I69097c73b745ffef3727135312a36f1f1d2627e5 Reviewed-by: Lars Knoll <lars.knoll@qt.io>
-rw-r--r--src/imports/multimedia/qdeclarativetorch.cpp2
-rw-r--r--src/multimedia/camera/qcamera.cpp6
-rw-r--r--src/multimedia/camera/qcameraimagecapture.cpp6
-rw-r--r--src/multimedia/platform/android/mediacapture/qandroidcaptureservice.cpp6
-rw-r--r--src/multimedia/platform/android/mediacapture/qandroidcaptureservice_p.h8
-rw-r--r--src/multimedia/platform/darwin/camera/avfcameraservice.mm45
-rw-r--r--src/multimedia/platform/darwin/camera/avfcameraservice_p.h12
-rw-r--r--src/multimedia/platform/darwin/camera/avfcamerasession.mm13
-rw-r--r--src/multimedia/platform/darwin/camera/avfcamerasession_p.h1
-rw-r--r--src/multimedia/platform/darwin/camera/avfimagecapturecontrol.mm4
-rw-r--r--src/multimedia/platform/gstreamer/mediacapture/qgstreamercameraimagecapture.cpp8
-rw-r--r--src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture.cpp6
-rw-r--r--src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture_p.h8
-rw-r--r--src/multimedia/platform/qnx/camera/bbcameraservice.cpp6
-rw-r--r--src/multimedia/platform/qnx/camera/bbcameraservice_p.h2
-rw-r--r--src/multimedia/platform/qplatformmediacapture_p.h8
-rw-r--r--tests/auto/unit/mockbackend/mockmediarecorderservice.h29
17 files changed, 127 insertions, 43 deletions
diff --git a/src/imports/multimedia/qdeclarativetorch.cpp b/src/imports/multimedia/qdeclarativetorch.cpp
index d0fabe099..ef2feb276 100644
--- a/src/imports/multimedia/qdeclarativetorch.cpp
+++ b/src/imports/multimedia/qdeclarativetorch.cpp
@@ -75,7 +75,7 @@ QDeclarativeTorch::QDeclarativeTorch(QCamera *camera)
if (!camera)
return;
auto *service = m_camera->captureSession()->platformSession();
- m_exposure = service->cameraControl()->exposureControl();
+ m_exposure = service->addCamera()->exposureControl();
if (m_exposure)
connect(m_exposure, SIGNAL(actualValueChanged(int)), SLOT(parameterChanged(int)));
diff --git a/src/multimedia/camera/qcamera.cpp b/src/multimedia/camera/qcamera.cpp
index e1a964fcd..10085cbac 100644
--- a/src/multimedia/camera/qcamera.cpp
+++ b/src/multimedia/camera/qcamera.cpp
@@ -90,7 +90,7 @@ void QCameraPrivate::init()
Q_Q(QCamera);
control = nullptr;
if (captureInterface && !cameraInfo.isNull()) {
- control = captureInterface->cameraControl();
+ control = captureInterface->addCamera();
control->setCamera(cameraInfo);
} else {
clear();
@@ -190,8 +190,10 @@ QCamera::QCamera(QCameraInfo::Position position, QObject *parent)
QCamera::~QCamera()
{
Q_D(QCamera);
- if (d->captureSession)
+ if (d->captureSession) {
+ d->captureInterface->releaseCamera(d->control);
d->captureSession->setCamera(nullptr);
+ }
Q_ASSERT(!d->captureSession);
}
diff --git a/src/multimedia/camera/qcameraimagecapture.cpp b/src/multimedia/camera/qcameraimagecapture.cpp
index c78ef2097..0682729c8 100644
--- a/src/multimedia/camera/qcameraimagecapture.cpp
+++ b/src/multimedia/camera/qcameraimagecapture.cpp
@@ -126,7 +126,7 @@ void QCameraImageCapture::setCaptureSession(QMediaCaptureSession *session)
return;
}
- d->control = session->platformSession()->imageCaptureControl();
+ d->control = session->platformSession()->addImageCapture();
if (!d->control)
return;
@@ -153,8 +153,10 @@ void QCameraImageCapture::setCaptureSession(QMediaCaptureSession *session)
QCameraImageCapture::~QCameraImageCapture()
{
- if (d_ptr->captureSession)
+ if (d_ptr->captureSession) {
+ d_ptr->captureSession->platformSession()->releaseImageCapture(d_ptr->control);
d_ptr->captureSession->setImageCapture(nullptr);
+ }
delete d_ptr;
}
diff --git a/src/multimedia/platform/android/mediacapture/qandroidcaptureservice.cpp b/src/multimedia/platform/android/mediacapture/qandroidcaptureservice.cpp
index e8375ee70..ff3e23701 100644
--- a/src/multimedia/platform/android/mediacapture/qandroidcaptureservice.cpp
+++ b/src/multimedia/platform/android/mediacapture/qandroidcaptureservice.cpp
@@ -77,13 +77,15 @@ QAndroidCaptureService::~QAndroidCaptureService()
delete m_cameraSession;
}
-QPlatformCamera *QAndroidCaptureService::cameraControl()
+QPlatformCamera *QAndroidCaptureService::addCamera()
{
+ // ###
return m_cameraControl;
}
-QPlatformCameraImageCapture *QAndroidCaptureService::imageCaptureControl()
+QPlatformCameraImageCapture *QAndroidCaptureService::addImageCapture()
{
+ // ###
return m_imageCaptureControl;
}
diff --git a/src/multimedia/platform/android/mediacapture/qandroidcaptureservice_p.h b/src/multimedia/platform/android/mediacapture/qandroidcaptureservice_p.h
index ab3707258..a6e7edc44 100644
--- a/src/multimedia/platform/android/mediacapture/qandroidcaptureservice_p.h
+++ b/src/multimedia/platform/android/mediacapture/qandroidcaptureservice_p.h
@@ -71,8 +71,12 @@ public:
explicit QAndroidCaptureService(QMediaRecorder::CaptureMode mode);
virtual ~QAndroidCaptureService();
- QPlatformCamera *cameraControl() override;
- QPlatformCameraImageCapture *imageCaptureControl() override;
+ QPlatformCamera *addCamera() override;
+ // void releaseCamera(QPlatformCamera *) override;
+
+ QPlatformCameraImageCapture *addImageCapture() override;
+ // void releaseImageCapture(QPlatformCameraImageCapture *) override;
+
QPlatformMediaEncoder *mediaEncoder() override;
bool isMuted() const override;
diff --git a/src/multimedia/platform/darwin/camera/avfcameraservice.mm b/src/multimedia/platform/darwin/camera/avfcameraservice.mm
index 2adf17eea..74e20bdb1 100644
--- a/src/multimedia/platform/darwin/camera/avfcameraservice.mm
+++ b/src/multimedia/platform/darwin/camera/avfcameraservice.mm
@@ -57,12 +57,8 @@ QT_USE_NAMESPACE
AVFCameraService::AVFCameraService()
{
m_session = new AVFCameraSession(this);
- m_cameraControl = new AVFCameraControl(this);
-
m_recorderControl = new AVFMediaEncoder(this);
- m_imageCaptureControl = new AVFImageCaptureControl(this);
-
m_audioCaptureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];
}
@@ -74,23 +70,56 @@ AVFCameraService::~AVFCameraService()
//delete controls before session,
//so they have a chance to do deinitialization
- delete m_imageCaptureControl;
+ if (m_imageCaptureControl)
+ delete m_imageCaptureControl;
//delete m_recorderControl;
- delete m_cameraControl;
+ if (m_cameraControl)
+ delete m_cameraControl;
delete m_session;
}
-QPlatformCamera *AVFCameraService::cameraControl()
+QPlatformCamera *AVFCameraService::addCamera()
{
+ if (!m_cameraControl) {
+ m_cameraControl = new AVFCameraControl(this);
+ }
return m_cameraControl;
}
-QPlatformCameraImageCapture *AVFCameraService::imageCaptureControl()
+void AVFCameraService::releaseCamera(QPlatformCamera *camera)
+{
+ if (camera) {
+ if (camera == m_cameraControl) {
+ // is this correct?
+ if (m_imageCaptureControl)
+ releaseImageCapture(m_imageCaptureControl);
+ m_session->setActiveCamera(QCameraInfo());
+ delete m_cameraControl;
+ m_cameraControl = nullptr;
+ }
+ }
+}
+
+QPlatformCameraImageCapture *AVFCameraService::addImageCapture()
{
+ if (!m_imageCaptureControl) {
+ if (m_cameraControl)
+ m_imageCaptureControl = new AVFImageCaptureControl(this);
+ }
return m_imageCaptureControl;
}
+void AVFCameraService::releaseImageCapture(QPlatformCameraImageCapture *imageCapture)
+{
+ if (imageCapture) {
+ if (imageCapture == m_imageCaptureControl) {
+ delete m_imageCaptureControl;
+ m_imageCaptureControl = nullptr;
+ }
+ }
+}
+
QPlatformMediaEncoder *AVFCameraService::mediaEncoder()
{
return m_recorderControl;
diff --git a/src/multimedia/platform/darwin/camera/avfcameraservice_p.h b/src/multimedia/platform/darwin/camera/avfcameraservice_p.h
index 11a89aff0..e824e6f60 100644
--- a/src/multimedia/platform/darwin/camera/avfcameraservice_p.h
+++ b/src/multimedia/platform/darwin/camera/avfcameraservice_p.h
@@ -73,8 +73,12 @@ public:
AVFCameraService();
~AVFCameraService();
- QPlatformCamera *cameraControl() override;
- QPlatformCameraImageCapture *imageCaptureControl() override;
+ QPlatformCamera *addCamera() override;
+ void releaseCamera(QPlatformCamera *) override;
+
+ QPlatformCameraImageCapture *addImageCapture() override;
+ void releaseImageCapture(QPlatformCameraImageCapture *) override;
+
QPlatformMediaEncoder *mediaEncoder() override;
bool isMuted() const override;
@@ -97,9 +101,9 @@ private:
AVCaptureDevice *m_audioCaptureDevice = nullptr;
AVFCameraSession *m_session;
- AVFCameraControl *m_cameraControl;
+ AVFCameraControl *m_cameraControl = nullptr;
AVFMediaEncoder *m_recorderControl;
- AVFImageCaptureControl *m_imageCaptureControl;
+ AVFImageCaptureControl *m_imageCaptureControl = nullptr;
};
QT_END_NAMESPACE
diff --git a/src/multimedia/platform/darwin/camera/avfcamerasession.mm b/src/multimedia/platform/darwin/camera/avfcamerasession.mm
index ca539611f..48fb07841 100644
--- a/src/multimedia/platform/darwin/camera/avfcamerasession.mm
+++ b/src/multimedia/platform/darwin/camera/avfcamerasession.mm
@@ -173,7 +173,10 @@ void AVFCameraSession::setActiveCamera(const QCameraInfo &info)
{
if (m_activeCameraInfo != info) {
m_activeCameraInfo = info;
- attachVideoInputDevice();
+ if (info.isNull())
+ removeVideoInputDevice();
+ else
+ attachVideoInputDevice();
}
}
@@ -282,14 +285,18 @@ AVCaptureDevice *AVFCameraSession::createCaptureDevice()
return device;
}
-void AVFCameraSession::attachVideoInputDevice()
+void AVFCameraSession::removeVideoInputDevice()
{
- //Attach video input device:
if (m_videoInput) {
[m_captureSession removeInput:m_videoInput];
[m_videoInput release];
m_videoInput = nullptr;
}
+}
+void AVFCameraSession::attachVideoInputDevice()
+{
+ //Attach video input device:
+ removeVideoInputDevice();
AVCaptureDevice *videoDevice = createCaptureDevice();
diff --git a/src/multimedia/platform/darwin/camera/avfcamerasession_p.h b/src/multimedia/platform/darwin/camera/avfcamerasession_p.h
index 3448d9872..007310d5d 100644
--- a/src/multimedia/platform/darwin/camera/avfcamerasession_p.h
+++ b/src/multimedia/platform/darwin/camera/avfcamerasession_p.h
@@ -107,6 +107,7 @@ Q_SIGNALS:
private:
AVCaptureDevice *createCaptureDevice();
void attachVideoInputDevice();
+ void removeVideoInputDevice();
bool applyImageEncoderSettings();
static int m_defaultCameraIndex;
diff --git a/src/multimedia/platform/darwin/camera/avfimagecapturecontrol.mm b/src/multimedia/platform/darwin/camera/avfimagecapturecontrol.mm
index 0e74b22e0..a638e145e 100644
--- a/src/multimedia/platform/darwin/camera/avfimagecapturecontrol.mm
+++ b/src/multimedia/platform/darwin/camera/avfimagecapturecontrol.mm
@@ -273,7 +273,7 @@ QImageEncoderSettings AVFImageCaptureControl::imageSettings() const
QSize res(qt_device_format_resolution(captureDevice.activeFormat));
#ifdef Q_OS_IOS
- if (!m_service->imageCaptureControl() || !m_service->avfImageCaptureControl()->stillImageOutput()) {
+ if (!m_service->addImageCapture() || !m_service->addImageCapture()->stillImageOutput()) {
qDebugCamera() << Q_FUNC_INFO << "no still image output";
return settings;
}
@@ -311,7 +311,7 @@ bool AVFImageCaptureControl::applySettings()
if (!session)
return false;
- if (!m_service->imageCaptureControl()
+ if (!m_service->addImageCapture()
|| !m_service->avfImageCaptureControl()->stillImageOutput()) {
qDebugCamera() << Q_FUNC_INFO << "no still image output";
return false;
diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamercameraimagecapture.cpp b/src/multimedia/platform/gstreamer/mediacapture/qgstreamercameraimagecapture.cpp
index ee91b3cc1..735a55aed 100644
--- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamercameraimagecapture.cpp
+++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamercameraimagecapture.cpp
@@ -83,8 +83,8 @@ QGstreamerCameraImageCapture::QGstreamerCameraImageCapture(QGstreamerMediaCaptur
sink.set("signal-handoffs", true);
g_signal_connect(sink.object(), "handoff", G_CALLBACK(&QGstreamerCameraImageCapture::saveImageFilter), this);
- connect(m_session->cameraControl(), &QPlatformCamera::activeChanged, this, &QGstreamerCameraImageCapture::cameraActiveChanged);
- cameraActive = m_session->cameraControl()->isActive();
+ connect(m_session->addCamera(), &QPlatformCamera::activeChanged, this, &QGstreamerCameraImageCapture::cameraActiveChanged);
+ cameraActive = m_session->addCamera()->isActive();
}
QGstreamerCameraImageCapture::~QGstreamerCameraImageCapture()
@@ -153,7 +153,7 @@ int QGstreamerCameraImageCapture::captureToBuffer()
int QGstreamerCameraImageCapture::doCapture(const QString &fileName)
{
- if (!m_session->cameraControl()) {
+ if (!m_session->addCamera()) {
//emit error in the next event loop,
//so application can associate it with returned request id.
QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection,
@@ -293,7 +293,7 @@ void QGstreamerCameraImageCapture::unlink()
void QGstreamerCameraImageCapture::link()
{
- Q_ASSERT(m_session->cameraControl());
+ Q_ASSERT(m_session->addCamera());
if (!bin.staticPad("sink").peer().isNull())
return;
diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture.cpp b/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture.cpp
index edfb12eba..6b3b2bd65 100644
--- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture.cpp
+++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture.cpp
@@ -99,13 +99,15 @@ QGstreamerMediaCapture::~QGstreamerMediaCapture()
delete m_mediaEncoder;
}
-QPlatformCamera *QGstreamerMediaCapture::cameraControl()
+QPlatformCamera *QGstreamerMediaCapture::addCamera()
{
+ // ###
return gstCamera;
}
-QPlatformCameraImageCapture *QGstreamerMediaCapture::imageCaptureControl()
+QPlatformCameraImageCapture *QGstreamerMediaCapture::addImageCapture()
{
+ // ###
return m_imageCapture;
}
diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture_p.h b/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture_p.h
index fbac1ac99..005f8216c 100644
--- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture_p.h
+++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture_p.h
@@ -73,8 +73,12 @@ public:
QGstreamerMediaCapture(QMediaRecorder::CaptureMode mode);
virtual ~QGstreamerMediaCapture();
- QPlatformCamera *cameraControl() override;
- QPlatformCameraImageCapture *imageCaptureControl() override;
+ QPlatformCamera *addCamera() override;
+ // void releaseCamera(QPlatformCamera *) override;
+
+ QPlatformCameraImageCapture *addImageCapture() override;
+ // void releaseImageCapture(QPlatformCameraImageCapture *) override;
+
QPlatformMediaEncoder *mediaEncoder() override;
bool isMuted() const override;
diff --git a/src/multimedia/platform/qnx/camera/bbcameraservice.cpp b/src/multimedia/platform/qnx/camera/bbcameraservice.cpp
index 17789042a..d08fdfc20 100644
--- a/src/multimedia/platform/qnx/camera/bbcameraservice.cpp
+++ b/src/multimedia/platform/qnx/camera/bbcameraservice.cpp
@@ -73,13 +73,15 @@ BbCameraService::~BbCameraService()
{
}
-QPlatformCamera *BbCameraService::cameraControl()
+QPlatformCamera *BbCameraService::addCamera()
{
+ // ###
return m_cameraControl;
}
-QPlatformCameraImageCapture *BbCameraService::imageCaptureControl()
+QPlatformCameraImageCapture *BbCameraService::addImageCapture()
{
+ // ###
return m_cameraImageCaptureControl;
}
diff --git a/src/multimedia/platform/qnx/camera/bbcameraservice_p.h b/src/multimedia/platform/qnx/camera/bbcameraservice_p.h
index c2c0e1ddb..272f595c8 100644
--- a/src/multimedia/platform/qnx/camera/bbcameraservice_p.h
+++ b/src/multimedia/platform/qnx/camera/bbcameraservice_p.h
@@ -75,7 +75,7 @@ public:
explicit BbCameraService(QObject *parent = 0);
~BbCameraService();
- QPlatformCamera *cameraControl() override;
+ QPlatformCamera *addCamera() override;
QPlatformCameraImageCapture *imageCaptureControl() override;
QPlatformMediaEncoder *mediaEncoder() override;
diff --git a/src/multimedia/platform/qplatformmediacapture_p.h b/src/multimedia/platform/qplatformmediacapture_p.h
index 39cfa3b90..3b17aa82d 100644
--- a/src/multimedia/platform/qplatformmediacapture_p.h
+++ b/src/multimedia/platform/qplatformmediacapture_p.h
@@ -68,8 +68,12 @@ public:
QPlatformMediaCaptureSession() = default;
virtual ~QPlatformMediaCaptureSession();
- virtual QPlatformCamera *cameraControl() = 0;
- virtual QPlatformCameraImageCapture *imageCaptureControl() = 0;
+ virtual QPlatformCamera *addCamera() = 0;
+ virtual void releaseCamera(QPlatformCamera *) {}
+
+ virtual QPlatformCameraImageCapture *addImageCapture() = 0;
+ virtual void releaseImageCapture(QPlatformCameraImageCapture *) {};
+
virtual QPlatformMediaEncoder *mediaEncoder() = 0;
virtual bool isMuted() const = 0;
diff --git a/tests/auto/unit/mockbackend/mockmediarecorderservice.h b/tests/auto/unit/mockbackend/mockmediarecorderservice.h
index 24f9efed6..4db5efb59 100644
--- a/tests/auto/unit/mockbackend/mockmediarecorderservice.h
+++ b/tests/auto/unit/mockbackend/mockmediarecorderservice.h
@@ -45,18 +45,39 @@ public:
: hasControls(true)
{
mockControl = new MockMediaEncoderControl(this);
- mockCameraControl = new MockCameraControl(this);
mockExposureControl = new MockCameraExposureControl(this);
mockFocusControl = new MockCameraFocusControl(this);
- mockCaptureControl = new MockCaptureControl(mockCameraControl, this);
mockImageProcessingControl = new MockImageProcessingControl(this);
}
~MockMediaRecorderService()
{
}
- QPlatformCamera *cameraControl() override { return hasControls ? mockCameraControl : nullptr; }
- QPlatformCameraImageCapture *imageCaptureControl() override { return hasControls ? mockCaptureControl : nullptr; }
+ QPlatformCamera *addCamera() override
+ {
+ if (hasControls) {
+ if (!mockCameraControl)
+ mockCameraControl = new MockCameraControl(this);
+ return mockCameraControl;
+ }
+ return nullptr;
+ }
+
+ void releaseCamera(QPlatformCamera *) override {}
+
+ QPlatformCameraImageCapture *addImageCapture() override
+ {
+ if (hasControls) {
+ if (!mockCaptureControl)
+ if (mockCameraControl)
+ mockCaptureControl = new MockCaptureControl(mockCameraControl, this);
+ return mockCaptureControl;
+ }
+ return nullptr;
+ }
+
+ void releaseImageCapture(QPlatformCameraImageCapture *) override {}
+
QPlatformMediaEncoder *mediaEncoder() override { return hasControls ? mockControl : nullptr; }
void setVideoPreview(QVideoSink *) override {}