summaryrefslogtreecommitdiffstats
path: root/src/plugins/android
diff options
context:
space:
mode:
authorQt Forward Merge Bot <qt_forward_merge_bot@qt-project.org>2019-05-14 03:02:36 +0200
committerQt Forward Merge Bot <qt_forward_merge_bot@qt-project.org>2019-05-14 03:02:36 +0200
commit7ef21f7ed206749252fbd03f673a8588890828b1 (patch)
treecfba547a521bc5f5c2ccbf829a1f0f0830620fee /src/plugins/android
parent268d78ca745bf7d54545e51a4f22e2fa24a8675c (diff)
parent333aecfd4190b067f29332d3a5087530d92d59b3 (diff)
Merge remote-tracking branch 'origin/5.12' into 5.13
Diffstat (limited to 'src/plugins/android')
-rw-r--r--src/plugins/android/src/mediacapture/qandroidcamerasession.cpp43
-rw-r--r--src/plugins/android/src/wrappers/jni/androidcamera.cpp12
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()