// Copyright (C) 2016 The Qt Company Ltd. // Copyright (C) 2016 Ruslan Baratov // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only #ifndef QANDROIDCAMERASESSION_H #define QANDROIDCAMERASESSION_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists purely as an // implementation detail. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #include #include #include #include #include #include "androidcamera_p.h" QT_BEGIN_NAMESPACE class QAndroidVideoOutput; class QAndroidTextureVideoOutput ; class QVideoSink; class QAndroidCameraSession : public QObject { Q_OBJECT public: explicit QAndroidCameraSession(QObject *parent = 0); ~QAndroidCameraSession(); static const QList &availableCameras(); void setSelectedCameraId(int cameraId) { m_selectedCamera = cameraId; } int getSelectedCameraId() { return m_selectedCamera; } AndroidCamera *camera() const { return m_camera; } bool isActive() const { return m_active; } void setActive(bool active); void applyResolution(const QSize &captureSize = QSize(), bool restartPreview = true); QAndroidVideoOutput *videoOutput() const { return m_videoOutput; } void setVideoOutput(QAndroidVideoOutput *output); void setCameraFormat(const QCameraFormat &format); QList getSupportedPreviewSizes() const; QList getSupportedPixelFormats() const; QList getSupportedPreviewFpsRange() const; QImageEncoderSettings imageSettings() const { return m_actualImageSettings; } void setImageSettings(const QImageEncoderSettings &settings); bool isReadyForCapture() const; void setReadyForCapture(bool ready); int capture(const QString &fileName); int captureToBuffer(); int currentCameraRotation() const; void setPreviewFormat(AndroidCamera::ImageFormat format); struct PreviewCallback { virtual void onFrameAvailable(const QVideoFrame &frame) = 0; }; void setPreviewCallback(PreviewCallback *callback); void setVideoSink(QVideoSink *surface); void disableRotation(); void enableRotation(); void setKeepAlive(bool keepAlive); Q_SIGNALS: void activeChanged(bool); void error(int error, const QString &errorString); void opened(); void readyForCaptureChanged(bool); void imageExposed(int id); void imageCaptured(int id, const QImage &preview); void imageMetadataAvailable(int id, const QMediaMetaData &key); void imageAvailable(int id, const QVideoFrame &buffer); void imageSaved(int id, const QString &fileName); void imageCaptureError(int id, int error, const QString &errorString); private Q_SLOTS: void onVideoOutputReady(bool ready); void updateOrientation(); void onApplicationStateChanged(); void onCameraTakePictureFailed(); void onCameraPictureExposed(); void onCameraPictureCaptured(const QVideoFrame &frame); void onLastPreviewFrameFetched(const QVideoFrame &frame); void onNewPreviewFrame(const QVideoFrame &frame); void onCameraPreviewStarted(); void onCameraPreviewFailedToStart(); void onCameraPreviewStopped(); private: static void updateAvailableCameras(); bool open(); void close(); bool startPreview(); void stopPreview(); void applyImageSettings(); void processPreviewImage(int id, const QVideoFrame &frame, int rotation); void processCapturedImage(int id, const QVideoFrame &frame, bool captureToBuffer, const QString &fileName); void setActiveHelper(bool active); int captureImage(); QSize getDefaultResolution() const; int m_selectedCamera; AndroidCamera *m_camera; QAndroidVideoOutput *m_videoOutput; bool m_active = false; bool m_isStateSaved = false; bool m_savedState = false; bool m_previewStarted; bool m_rotationEnabled = false; QVideoSink *m_sink = nullptr; QAndroidTextureVideoOutput *m_textureOutput = nullptr; QImageEncoderSettings m_requestedImageSettings; QImageEncoderSettings m_actualImageSettings; AndroidCamera::FpsRange m_requestedFpsRange; AndroidCamera::ImageFormat m_requestedPixelFromat = AndroidCamera::ImageFormat::NV21; bool m_readyForCapture; int m_currentImageCaptureId; QString m_currentImageCaptureFileName; bool m_imageCaptureToBuffer; QMutex m_videoFrameCallbackMutex; PreviewCallback *m_previewCallback; bool m_keepActive; }; QT_END_NAMESPACE #endif // QANDROIDCAMERASESSION_H