diff options
author | Jukka Passi <jukka.passi@qt.io> | 2021-05-05 15:57:54 +0300 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2021-05-06 09:05:20 +0000 |
commit | 82592f8b48ee8c2bb4de10ff617f21d52ebb030b (patch) | |
tree | aaf2ca5e590c0752ce4d949775aafba32072493d | |
parent | f4aad47a91f4149709b7b6f45ac60280bdbf873a (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>
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; |