diff options
author | Qt Forward Merge Bot <qt_forward_merge_bot@qt-project.org> | 2019-05-14 03:02:36 +0200 |
---|---|---|
committer | Qt Forward Merge Bot <qt_forward_merge_bot@qt-project.org> | 2019-05-14 03:02:36 +0200 |
commit | 7ef21f7ed206749252fbd03f673a8588890828b1 (patch) | |
tree | cfba547a521bc5f5c2ccbf829a1f0f0830620fee /src/plugins/android | |
parent | 268d78ca745bf7d54545e51a4f22e2fa24a8675c (diff) | |
parent | 333aecfd4190b067f29332d3a5087530d92d59b3 (diff) |
Merge remote-tracking branch 'origin/5.12' into 5.13
Change-Id: I03225f5e980a69246b046351f7d7d8e84f102ca0
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() |