summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJukka Passi <jukka.passi@qt.io>2021-05-05 15:57:54 +0300
committerLars Knoll <lars.knoll@qt.io>2021-05-06 09:05:20 +0000
commit82592f8b48ee8c2bb4de10ff617f21d52ebb030b (patch)
treeaaf2ca5e590c0752ce4d949775aafba32072493d
parentf4aad47a91f4149709b7b6f45ac60280bdbf873a (diff)
Android: Fix Android build
Fixing the Android build by using the new pattern of creating QPlatformMediaEncoder/QPlatformCameraImageCapture through the platform integration. Change-Id: Ie6cd30c8e6054cba73e919f17fbbe832e998020d Reviewed-by: Lars Knoll <lars.knoll@qt.io>
-rw-r--r--src/multimedia/platform/android/mediacapture/qandroidcameracontrol.cpp41
-rw-r--r--src/multimedia/platform/android/mediacapture/qandroidcameracontrol_p.h9
-rw-r--r--src/multimedia/platform/android/mediacapture/qandroidcameraimagecapturecontrol.cpp36
-rw-r--r--src/multimedia/platform/android/mediacapture/qandroidcameraimagecapturecontrol_p.h6
-rw-r--r--src/multimedia/platform/android/mediacapture/qandroidcaptureservice.cpp55
-rw-r--r--src/multimedia/platform/android/mediacapture/qandroidcaptureservice_p.h15
-rw-r--r--src/multimedia/platform/android/mediacapture/qandroidmediaencoder.cpp34
-rw-r--r--src/multimedia/platform/android/mediacapture/qandroidmediaencoder_p.h9
-rw-r--r--src/multimedia/platform/android/qandroidintegration.cpp18
-rw-r--r--src/multimedia/platform/android/qandroidintegration_p.h3
10 files changed, 181 insertions, 45 deletions
diff --git a/src/multimedia/platform/android/mediacapture/qandroidcameracontrol.cpp b/src/multimedia/platform/android/mediacapture/qandroidcameracontrol.cpp
index 9900f2676..c079742a0 100644
--- a/src/multimedia/platform/android/mediacapture/qandroidcameracontrol.cpp
+++ b/src/multimedia/platform/android/mediacapture/qandroidcameracontrol.cpp
@@ -43,24 +43,17 @@
#include "qandroidcamerafocuscontrol_p.h"
#include "qandroidcameraimageprocessingcontrol_p.h"
#include "qandroidcameravideorenderercontrol_p.h"
+#include "qandroidcaptureservice_p.h"
#include <qmediadevicemanager.h>
#include <qcamerainfo.h>
#include <qtimer.h>
QT_BEGIN_NAMESPACE
-QAndroidCameraControl::QAndroidCameraControl(QAndroidCameraSession *session)
- : QPlatformCamera(0)
- , m_cameraSession(session)
-
+QAndroidCameraControl::QAndroidCameraControl(QCamera *camera)
+ : QPlatformCamera(camera)
{
- connect(m_cameraSession, SIGNAL(statusChanged(QCamera::Status)),
- this, SIGNAL(statusChanged(QCamera::Status)));
-
- connect(m_cameraSession, SIGNAL(stateChanged(QCamera::State)),
- this, SIGNAL(stateChanged(QCamera::State)));
-
- connect(m_cameraSession, SIGNAL(error(int,QString)), this, SIGNAL(error(int,QString)));
+ Q_ASSERT(camera);
m_recalculateTimer = new QTimer(this);
m_recalculateTimer->setInterval(1000);
@@ -100,6 +93,32 @@ void QAndroidCameraControl::setCamera(const QCameraInfo &camera)
m_cameraSession->setSelectedCamera(id);
}
+void QAndroidCameraControl::setCaptureSession(QPlatformMediaCaptureSession *session)
+{
+ QAndroidCaptureService *captureSession = static_cast<QAndroidCaptureService *>(session);
+ if (m_service == captureSession)
+ return;
+
+ m_service = captureSession;
+ if (!m_service) {
+ m_cameraSession = nullptr;
+ disconnect(m_cameraSession,nullptr,this,nullptr);
+ return;
+ }
+
+ m_cameraSession = m_service->cameraSession();
+ Q_ASSERT(m_cameraSession);
+
+ connect(m_cameraSession, SIGNAL(statusChanged(QCamera::Status)),
+ this, SIGNAL(statusChanged(QCamera::Status)));
+
+ connect(m_cameraSession, SIGNAL(stateChanged(QCamera::State)),
+ this, SIGNAL(stateChanged(QCamera::State)));
+
+ connect(m_cameraSession, SIGNAL(error(int,QString)), this, SIGNAL(error(int,QString)));
+
+}
+
QPlatformCameraFocus *QAndroidCameraControl::focusControl()
{
return m_cameraSession->focusControl();
diff --git a/src/multimedia/platform/android/mediacapture/qandroidcameracontrol_p.h b/src/multimedia/platform/android/mediacapture/qandroidcameracontrol_p.h
index bfd1bb0f6..3c22039a3 100644
--- a/src/multimedia/platform/android/mediacapture/qandroidcameracontrol_p.h
+++ b/src/multimedia/platform/android/mediacapture/qandroidcameracontrol_p.h
@@ -58,12 +58,13 @@ QT_BEGIN_NAMESPACE
class QAndroidCameraSession;
class QAndroidCameraVideoRendererControl;
+class QAndroidCaptureService;
class QAndroidCameraControl : public QPlatformCamera
{
Q_OBJECT
public:
- explicit QAndroidCameraControl(QAndroidCameraSession *session);
+ explicit QAndroidCameraControl(QCamera *camera);
virtual ~QAndroidCameraControl();
bool isActive() const override;
@@ -73,13 +74,15 @@ public:
void setCamera(const QCameraInfo &camera) override;
+ void setCaptureSession(QPlatformMediaCaptureSession *session) override;
+
QPlatformCameraFocus *focusControl() override;
QPlatformCameraExposure *exposureControl() override;
QPlatformCameraImageProcessing *imageProcessingControl() override;
private:
- QAndroidCameraSession *m_cameraSession;
-
+ QAndroidCameraSession *m_cameraSession = nullptr;
+ QAndroidCaptureService *m_service = nullptr;
QTimer *m_recalculateTimer;
};
diff --git a/src/multimedia/platform/android/mediacapture/qandroidcameraimagecapturecontrol.cpp b/src/multimedia/platform/android/mediacapture/qandroidcameraimagecapturecontrol.cpp
index 492dc8431..c75d2b28b 100644
--- a/src/multimedia/platform/android/mediacapture/qandroidcameraimagecapturecontrol.cpp
+++ b/src/multimedia/platform/android/mediacapture/qandroidcameraimagecapturecontrol.cpp
@@ -40,20 +40,13 @@
#include "qandroidcameraimagecapturecontrol_p.h"
#include "qandroidcamerasession_p.h"
+#include "qandroidcaptureservice_p.h"
QT_BEGIN_NAMESPACE
-QAndroidCameraImageCaptureControl::QAndroidCameraImageCaptureControl(QAndroidCameraSession *session)
- : QPlatformCameraImageCapture()
- , m_session(session)
+QAndroidCameraImageCaptureControl::QAndroidCameraImageCaptureControl(QCameraImageCapture *parent)
+ : QPlatformCameraImageCapture(parent)
{
- connect(m_session, SIGNAL(readyForCaptureChanged(bool)), this, SIGNAL(readyForCaptureChanged(bool)));
- connect(m_session, SIGNAL(imageExposed(int)), this, SIGNAL(imageExposed(int)));
- connect(m_session, SIGNAL(imageCaptured(int,QImage)), this, SIGNAL(imageCaptured(int,QImage)));
- connect(m_session, SIGNAL(imageMetadataAvailable(int,QString,QVariant)), this, SIGNAL(imageMetadataAvailable(int,QString,QVariant)));
- connect(m_session, SIGNAL(imageAvailable(int,QVideoFrame)), this, SIGNAL(imageAvailable(int,QVideoFrame)));
- connect(m_session, SIGNAL(imageSaved(int,QString)), this, SIGNAL(imageSaved(int,QString)));
- connect(m_session, SIGNAL(imageCaptureError(int,int,QString)), this, SIGNAL(error(int,int,QString)));
}
bool QAndroidCameraImageCaptureControl::isReadyForCapture() const
@@ -87,4 +80,27 @@ void QAndroidCameraImageCaptureControl::setImageSettings(const QImageEncoderSett
m_session->setImageSettings(settings);
}
+void QAndroidCameraImageCaptureControl::setCaptureSession(QPlatformMediaCaptureSession *session)
+{
+ QAndroidCaptureService *captureSession = static_cast<QAndroidCaptureService *>(session);
+ if (m_service == captureSession)
+ return;
+
+ m_service = captureSession;
+ if (!m_service) {
+ disconnect(m_session, nullptr, this, nullptr);
+ return;
+ }
+
+ m_session = m_service->cameraSession();
+ Q_ASSERT(m_session);
+
+ connect(m_session, SIGNAL(readyForCaptureChanged(bool)), this, SIGNAL(readyForCaptureChanged(bool)));
+ connect(m_session, SIGNAL(imageExposed(int)), this, SIGNAL(imageExposed(int)));
+ connect(m_session, SIGNAL(imageCaptured(int,QImage)), this, SIGNAL(imageCaptured(int,QImage)));
+ connect(m_session, SIGNAL(imageMetadataAvailable(int,QString,QVariant)), this, SIGNAL(imageMetadataAvailable(int,QString,QVariant)));
+ connect(m_session, SIGNAL(imageAvailable(int,QVideoFrame)), this, SIGNAL(imageAvailable(int,QVideoFrame)));
+ connect(m_session, SIGNAL(imageSaved(int,QString)), this, SIGNAL(imageSaved(int,QString)));
+ connect(m_session, SIGNAL(imageCaptureError(int,int,QString)), this, SIGNAL(error(int,int,QString)));
+}
QT_END_NAMESPACE
diff --git a/src/multimedia/platform/android/mediacapture/qandroidcameraimagecapturecontrol_p.h b/src/multimedia/platform/android/mediacapture/qandroidcameraimagecapturecontrol_p.h
index 3d941a44d..9db1a66e1 100644
--- a/src/multimedia/platform/android/mediacapture/qandroidcameraimagecapturecontrol_p.h
+++ b/src/multimedia/platform/android/mediacapture/qandroidcameraimagecapturecontrol_p.h
@@ -56,12 +56,13 @@
QT_BEGIN_NAMESPACE
class QAndroidCameraSession;
+class QAndroidCaptureService;
class QAndroidCameraImageCaptureControl : public QPlatformCameraImageCapture
{
Q_OBJECT
public:
- explicit QAndroidCameraImageCaptureControl(QAndroidCameraSession *session);
+ explicit QAndroidCameraImageCaptureControl(QCameraImageCapture *parent = nullptr);
bool isReadyForCapture() const override;
@@ -71,8 +72,11 @@ public:
QImageEncoderSettings imageSettings() const override;
void setImageSettings(const QImageEncoderSettings &settings) override;
+ void setCaptureSession(QPlatformMediaCaptureSession *session);
+
private:
QAndroidCameraSession *m_session;
+ QAndroidCaptureService *m_service;
};
QT_END_NAMESPACE
diff --git a/src/multimedia/platform/android/mediacapture/qandroidcaptureservice.cpp b/src/multimedia/platform/android/mediacapture/qandroidcaptureservice.cpp
index 3f0d6a0a8..3bf76ee83 100644
--- a/src/multimedia/platform/android/mediacapture/qandroidcaptureservice.cpp
+++ b/src/multimedia/platform/android/mediacapture/qandroidcaptureservice.cpp
@@ -56,21 +56,17 @@ QAndroidCaptureService::QAndroidCaptureService(QMediaRecorder::CaptureMode mode)
{
if (m_videoEnabled) {
m_cameraSession = new QAndroidCameraSession;
- m_cameraControl = new QAndroidCameraControl(m_cameraSession);
- m_imageCaptureControl = new QAndroidCameraImageCaptureControl(m_cameraSession);
} else {
m_cameraSession = 0;
- m_cameraControl = 0;
m_imageCaptureControl = 0;
}
m_captureSession = new QAndroidCaptureSession(m_cameraSession);
- m_recorderControl = new QAndroidMediaEncoder(m_captureSession);
}
QAndroidCaptureService::~QAndroidCaptureService()
{
- delete m_recorderControl;
+ delete m_encoder;
delete m_captureSession;
delete m_cameraControl;
delete m_imageCaptureControl;
@@ -82,16 +78,63 @@ QPlatformCamera *QAndroidCaptureService::camera()
return m_cameraControl;
}
+void QAndroidCaptureService::setCamera(QPlatformCamera *camera)
+{
+ QAndroidCameraControl *control = static_cast<QAndroidCameraControl *>(camera);
+ if (m_cameraControl == control)
+ return;
+
+ if (m_cameraControl)
+ m_cameraControl->setCaptureSession(nullptr);
+
+ m_cameraControl = control;
+ if (m_cameraControl)
+ m_cameraControl->setCaptureSession(this);
+
+ emit cameraChanged();
+}
+
QPlatformCameraImageCapture *QAndroidCaptureService::imageCapture()
{
return m_imageCaptureControl;
}
+void QAndroidCaptureService::setImageCapture(QPlatformCameraImageCapture *imageCapture)
+{
+ QAndroidCameraImageCaptureControl *control = static_cast<QAndroidCameraImageCaptureControl *>(imageCapture);
+ if (m_imageCaptureControl == control)
+ return;
+
+ if (m_imageCaptureControl)
+ m_imageCaptureControl->setCaptureSession(nullptr);
+
+ m_imageCaptureControl = control;
+ if (m_imageCaptureControl)
+ m_imageCaptureControl->setCaptureSession(this);
+}
+
QPlatformMediaEncoder *QAndroidCaptureService::mediaEncoder()
{
- return m_recorderControl;
+ return m_encoder;
}
+void QAndroidCaptureService::setMediaEncoder(QPlatformMediaEncoder *encoder)
+{
+ QAndroidMediaEncoder *control = static_cast<QAndroidMediaEncoder *>(encoder);
+
+ if (m_encoder == control)
+ return;
+
+ if (m_encoder)
+ m_encoder->setCaptureSession(nullptr);
+
+ m_encoder = control;
+ if (m_encoder)
+ m_encoder->setCaptureSession(this);
+
+ emit encoderChanged();
+
+}
bool QAndroidCaptureService::isMuted() const
{
diff --git a/src/multimedia/platform/android/mediacapture/qandroidcaptureservice_p.h b/src/multimedia/platform/android/mediacapture/qandroidcaptureservice_p.h
index 21e61d102..b49eb4eef 100644
--- a/src/multimedia/platform/android/mediacapture/qandroidcaptureservice_p.h
+++ b/src/multimedia/platform/android/mediacapture/qandroidcaptureservice_p.h
@@ -72,10 +72,13 @@ public:
virtual ~QAndroidCaptureService();
QPlatformCamera *camera() override;
+ void setCamera(QPlatformCamera *camera) override;
QPlatformCameraImageCapture *imageCapture() override;
+ void setImageCapture(QPlatformCameraImageCapture *imageCapture) override;
QPlatformMediaEncoder *mediaEncoder() override;
+ void setMediaEncoder(QPlatformMediaEncoder *encoder) override;
bool isMuted() const override;
void setMuted(bool muted) override;
@@ -86,12 +89,16 @@ public:
void setVideoPreview(QVideoSink *sink) override;
+ QAndroidCaptureSession *captureSession() const { return m_captureSession; }
+ QAndroidCameraSession *cameraSession() const { return m_cameraSession; }
+
+private:
bool m_videoEnabled = false;
- QAndroidMediaEncoder *m_recorderControl;
- QAndroidCaptureSession *m_captureSession;
- QAndroidCameraControl *m_cameraControl;
- QAndroidCameraSession *m_cameraSession;
+ QAndroidMediaEncoder *m_encoder = nullptr;
+ QAndroidCaptureSession *m_captureSession = nullptr;
+ QAndroidCameraControl *m_cameraControl = nullptr;
+ QAndroidCameraSession *m_cameraSession = nullptr;
QAndroidCameraImageCaptureControl *m_imageCaptureControl;
};
diff --git a/src/multimedia/platform/android/mediacapture/qandroidmediaencoder.cpp b/src/multimedia/platform/android/mediacapture/qandroidmediaencoder.cpp
index 9d278b1da..d26a6167c 100644
--- a/src/multimedia/platform/android/mediacapture/qandroidmediaencoder.cpp
+++ b/src/multimedia/platform/android/mediacapture/qandroidmediaencoder.cpp
@@ -40,18 +40,13 @@
#include "qandroidmediaencoder_p.h"
#include "qandroidcapturesession_p.h"
+#include "qandroidcaptureservice_p.h"
QT_BEGIN_NAMESPACE
-QAndroidMediaEncoder::QAndroidMediaEncoder(QAndroidCaptureSession *session)
- : QPlatformMediaEncoder()
- , m_session(session)
+QAndroidMediaEncoder::QAndroidMediaEncoder(QMediaEncoder *parent)
+ : QPlatformMediaEncoder(parent)
{
- connect(m_session, SIGNAL(stateChanged(QMediaEncoder::State)), this, SIGNAL(stateChanged(QMediaEncoder::State)));
- connect(m_session, SIGNAL(statusChanged(QMediaEncoder::Status)), this, SIGNAL(statusChanged(QMediaEncoder::Status)));
- connect(m_session, SIGNAL(durationChanged(qint64)), this, SIGNAL(durationChanged(qint64)));
- connect(m_session, SIGNAL(actualLocationChanged(QUrl)), this, SIGNAL(actualLocationChanged(QUrl)));
- connect(m_session, SIGNAL(error(int,QString)), this, SIGNAL(error(int,QString)));
}
QUrl QAndroidMediaEncoder::outputLocation() const
@@ -94,5 +89,28 @@ void QAndroidMediaEncoder::setEncoderSettings(const QMediaEncoderSettings &setti
m_session->setEncoderSettings(settings);
}
+void QAndroidMediaEncoder::setCaptureSession(QPlatformMediaCaptureSession *session)
+{
+ QAndroidCaptureService *captureSession = static_cast<QAndroidCaptureService *>(session);
+ if (m_service == captureSession)
+ return;
+
+ if (m_service)
+ setState(QMediaEncoder::StoppedState);
+
+ m_service = captureSession;
+ if (!m_service) {
+ disconnect(m_session, nullptr, this, nullptr);
+ return;
+ }
+ m_session = m_service->captureSession();
+ Q_ASSERT(m_session);
+
+ connect(m_session, SIGNAL(stateChanged(QMediaEncoder::State)), this, SIGNAL(stateChanged(QMediaEncoder::State)));
+ connect(m_session, SIGNAL(statusChanged(QMediaEncoder::Status)), this, SIGNAL(statusChanged(QMediaEncoder::Status)));
+ connect(m_session, SIGNAL(durationChanged(qint64)), this, SIGNAL(durationChanged(qint64)));
+ connect(m_session, SIGNAL(actualLocationChanged(QUrl)), this, SIGNAL(actualLocationChanged(QUrl)));
+ connect(m_session, SIGNAL(error(int,QString)), this, SIGNAL(error(int,QString)));
+}
QT_END_NAMESPACE
diff --git a/src/multimedia/platform/android/mediacapture/qandroidmediaencoder_p.h b/src/multimedia/platform/android/mediacapture/qandroidmediaencoder_p.h
index 1ae8d9cf6..b87da75cf 100644
--- a/src/multimedia/platform/android/mediacapture/qandroidmediaencoder_p.h
+++ b/src/multimedia/platform/android/mediacapture/qandroidmediaencoder_p.h
@@ -52,16 +52,18 @@
//
#include <private/qplatformmediaencoder_p.h>
+#include <private/qplatformmediacapture_p.h>
QT_BEGIN_NAMESPACE
class QAndroidCaptureSession;
+class QAndroidCaptureService;
class QAndroidMediaEncoder : public QPlatformMediaEncoder
{
Q_OBJECT
public:
- explicit QAndroidMediaEncoder(QAndroidCaptureSession *session);
+ explicit QAndroidMediaEncoder(QMediaEncoder *parent);
QUrl outputLocation() const override;
bool setOutputLocation(const QUrl &location) override;
@@ -72,11 +74,14 @@ public:
void setEncoderSettings(const QMediaEncoderSettings &settings) override;
+ void setCaptureSession(QPlatformMediaCaptureSession *session);
+
public Q_SLOTS:
void setState(QMediaEncoder::State state) override;
private:
- QAndroidCaptureSession *m_session;
+ QAndroidCaptureSession *m_session = nullptr;
+ QAndroidCaptureService *m_service = nullptr;
};
QT_END_NAMESPACE
diff --git a/src/multimedia/platform/android/qandroidintegration.cpp b/src/multimedia/platform/android/qandroidintegration.cpp
index fbb9b41c7..2ee95a509 100644
--- a/src/multimedia/platform/android/qandroidintegration.cpp
+++ b/src/multimedia/platform/android/qandroidintegration.cpp
@@ -46,6 +46,9 @@
#include "private/androidsurfacetexture_p.h"
#include "private/androidsurfaceview_p.h"
#include "private/androidcamera_p.h"
+#include "private/qandroidcameracontrol_p.h"
+#include "private/qandroidcameraimagecapturecontrol_p.h"
+#include "private/qandroidmediaencoder_p.h"
#include "private/androidmediarecorder_p.h"
#include "private/qandroidformatsinfo_p.h"
#include "private/qandroidmediaplayercontrol_p.h"
@@ -90,6 +93,21 @@ QPlatformMediaPlayer *QAndroidIntegration::createPlayer(QMediaPlayer *player)
return new QAndroidMediaPlayerControl(player);
}
+QPlatformCamera *QAndroidIntegration::createCamera(QCamera *camera)
+{
+ return new QAndroidCameraControl(camera);
+}
+
+QPlatformMediaEncoder *QAndroidIntegration::createEncoder(QMediaEncoder *encoder)
+{
+ return new QAndroidMediaEncoder(encoder);
+}
+
+QPlatformCameraImageCapture *QAndroidIntegration::createImageCapture(QCameraImageCapture *imageCapture)
+{
+ return new QAndroidCameraImageCaptureControl(imageCapture);
+}
+
Q_DECL_EXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void * /*reserved*/)
{
static bool initialized = false;
diff --git a/src/multimedia/platform/android/qandroidintegration_p.h b/src/multimedia/platform/android/qandroidintegration_p.h
index bf3744407..540d66e21 100644
--- a/src/multimedia/platform/android/qandroidintegration_p.h
+++ b/src/multimedia/platform/android/qandroidintegration_p.h
@@ -68,6 +68,9 @@ public:
QPlatformMediaCaptureSession *createCaptureSession(QMediaRecorder::CaptureMode mode) override;
QPlatformMediaPlayer *createPlayer(QMediaPlayer *player) override;
+ QPlatformCamera *createCamera(QCamera *camera) override;
+ QPlatformMediaEncoder *createEncoder(QMediaEncoder *encoder) override;
+ QPlatformCameraImageCapture *createImageCapture(QCameraImageCapture *imageCapture) override;
QAndroidDeviceManager *m_manager = nullptr;
QPlatformMediaFormatInfo *m_formatInfo = nullptr;