diff options
author | Val Doroshchuk <valentyn.doroshchuk@qt.io> | 2019-03-28 15:52:11 +0100 |
---|---|---|
committer | VaL Doroshchuk <valentyn.doroshchuk@qt.io> | 2019-05-13 11:37:57 +0000 |
commit | 333aecfd4190b067f29332d3a5087530d92d59b3 (patch) | |
tree | cdb93fe2d1c47398c684a2382b1d03427ec3587f | |
parent | b76fcb32d1cc1d87f1943900c2823c02ee85dbb6 (diff) |
Android: Allow starting camera without viewfinder available
Currently it is not able to start camera without viewfinder.
For this purpose there is QAndroidCameraDataVideoOutput with SurfaceView
in order to be able to start the camera preview.
Implemented dummy QAbstractVideoSurface to render to it when no video
output is provided before starting the preview.
Task-number: QTBUG-73582
Fixes: QTBUG-73237
Change-Id: Ic76d247b5d5352e8539ba61271484e56d3a40fbd
Reviewed-by: Christian Strømme <christian.stromme@qt.io>
-rw-r--r-- | src/plugins/android/src/mediacapture/qandroidcamerasession.cpp | 43 |
1 files changed, 32 insertions, 11 deletions
diff --git a/src/plugins/android/src/mediacapture/qandroidcamerasession.cpp b/src/plugins/android/src/mediacapture/qandroidcamerasession.cpp index efcd56580..6a30e5300 100644 --- a/src/plugins/android/src/mediacapture/qandroidcamerasession.cpp +++ b/src/plugins/android/src/mediacapture/qandroidcamerasession.cpp @@ -45,6 +45,8 @@ #include "qandroidvideooutput.h" #include "qandroidmediavideoprobecontrol.h" #include "qandroidmultimediautils.h" +#include "qandroidcameravideorenderercontrol.h" +#include <qabstractvideosurface.h> #include <QtConcurrent/qtconcurrentrun.h> #include <qfile.h> #include <qguiapplication.h> @@ -415,27 +417,46 @@ QList<AndroidCamera::FpsRange> QAndroidCameraSession::getSupportedPreviewFpsRang return m_camera ? m_camera->getSupportedPreviewFpsRange() : QList<AndroidCamera::FpsRange>(); } +struct NullSurface : QAbstractVideoSurface +{ + NullSurface(QObject *parent = nullptr) : QAbstractVideoSurface(parent) { } + QList<QVideoFrame::PixelFormat> supportedPixelFormats( + QAbstractVideoBuffer::HandleType type = QAbstractVideoBuffer::NoHandle) const override + { + QList<QVideoFrame::PixelFormat> result; + if (type == QAbstractVideoBuffer::NoHandle) + result << QVideoFrame::Format_NV21; + + return result; + } + + bool present(const QVideoFrame &) { return false; } +}; + bool QAndroidCameraSession::startPreview() { if (!m_camera) return false; - if (!m_videoOutput) { - Q_EMIT error(QCamera::InvalidRequestError, tr("Camera cannot be started without a viewfinder.")); - return false; - } - if (m_previewStarted) return true; - if (!m_videoOutput->isReady()) - return true; // delay starting until the video output is ready + if (m_videoOutput) { + if (!m_videoOutput->isReady()) + return true; // delay starting until the video output is ready - Q_ASSERT(m_videoOutput->surfaceTexture() || m_videoOutput->surfaceHolder()); + Q_ASSERT(m_videoOutput->surfaceTexture() || m_videoOutput->surfaceHolder()); - if ((m_videoOutput->surfaceTexture() && !m_camera->setPreviewTexture(m_videoOutput->surfaceTexture())) - || (m_videoOutput->surfaceHolder() && !m_camera->setPreviewDisplay(m_videoOutput->surfaceHolder()))) - return false; + if ((m_videoOutput->surfaceTexture() && !m_camera->setPreviewTexture(m_videoOutput->surfaceTexture())) + || (m_videoOutput->surfaceHolder() && !m_camera->setPreviewDisplay(m_videoOutput->surfaceHolder()))) + return false; + } else { + auto control = new QAndroidCameraVideoRendererControl(this, this); + control->setSurface(new NullSurface(this)); + qWarning() << "Starting camera without viewfinder available"; + + return true; + } m_status = QCamera::StartingStatus; emit statusChanged(m_status); |