diff options
author | Qt Forward Merge Bot <qt_forward_merge_bot@qt-project.org> | 2019-05-18 03:02:36 +0200 |
---|---|---|
committer | Qt Forward Merge Bot <qt_forward_merge_bot@qt-project.org> | 2019-05-18 03:02:36 +0200 |
commit | afca8928ce8e4113a224e57fa30a3b4bc5a2db47 (patch) | |
tree | d53331b50197b96694d2f9aa7c22a9e787f6f5e4 /src/plugins/android | |
parent | 26767a8ebe355f55a7fd5aaa9ec947dea1b6ce29 (diff) | |
parent | 7ef21f7ed206749252fbd03f673a8588890828b1 (diff) |
Merge remote-tracking branch 'origin/5.13' into dev
Change-Id: I82d63ba32a0c9f8b883d00ef1bd68df3a10da96c
Diffstat (limited to 'src/plugins/android')
-rw-r--r-- | src/plugins/android/src/mediacapture/qandroidcamerasession.cpp | 43 | ||||
-rw-r--r-- | src/plugins/android/src/wrappers/jni/androidcamera.cpp | 12 |
2 files changed, 43 insertions, 12 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); diff --git a/src/plugins/android/src/wrappers/jni/androidcamera.cpp b/src/plugins/android/src/wrappers/jni/androidcamera.cpp index e3afddd59..90af0119a 100644 --- a/src/plugins/android/src/wrappers/jni/androidcamera.cpp +++ b/src/plugins/android/src/wrappers/jni/androidcamera.cpp @@ -832,10 +832,17 @@ AndroidCameraPrivate::~AndroidCameraPrivate() { } +static qint32 s_activeCameras = 0; + bool AndroidCameraPrivate::init(int cameraId) { m_cameraId = cameraId; QJNIEnvironmentPrivate env; + + const bool opened = s_activeCameras & (1 << cameraId); + if (opened) + return false; + m_camera = QJNIObjectPrivate::callStaticObjectMethod("android/hardware/Camera", "open", "(I)Landroid/hardware/Camera;", @@ -854,6 +861,7 @@ bool AndroidCameraPrivate::init(int cameraId) QJNIObjectPrivate params = m_camera.callObjectMethod("getParameters", "()Landroid/hardware/Camera$Parameters;"); m_parameters = QJNIObjectPrivate(params); + s_activeCameras |= 1 << cameraId; return true; } @@ -864,8 +872,10 @@ void AndroidCameraPrivate::release() m_parametersMutex.lock(); m_parameters = QJNIObjectPrivate(); m_parametersMutex.unlock(); - if (m_camera.isValid()) + if (m_camera.isValid()) { m_camera.callMethod<void>("release"); + s_activeCameras &= ~(1 << m_cameraId); + } } bool AndroidCameraPrivate::lock() |