summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--examples/multimedia/shared/shared.pri6
-rw-r--r--src/gsttools/qgstreamerplayersession.cpp2
-rw-r--r--src/multimediawidgets/qgraphicsvideoitem.cpp14
-rw-r--r--src/plugins/android/src/mediacapture/qandroidcamerasession.cpp43
-rw-r--r--src/plugins/android/src/wrappers/jni/androidcamera.cpp12
5 files changed, 57 insertions, 20 deletions
diff --git a/examples/multimedia/shared/shared.pri b/examples/multimedia/shared/shared.pri
index 26bdf73cf..cb70f2b49 100644
--- a/examples/multimedia/shared/shared.pri
+++ b/examples/multimedia/shared/shared.pri
@@ -1,4 +1,6 @@
darwin {
+ PRODUCT_NAME = $$TARGET
+ macx-xcode: PRODUCT_NAME = $${LITERAL_DOLLAR}{PRODUCT_NAME}
INFOPLIST = \
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>" \
"<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">" \
@@ -17,9 +19,9 @@ darwin {
" <key>CFBundleIdentifier</key>" \
" <string>com.digia.$${LITERAL_DOLLAR}{PRODUCT_NAME:rfc1034identifier}</string>" \
" <key>CFBundleDisplayName</key>" \
- " <string>$${LITERAL_DOLLAR}{PRODUCT_NAME}</string>" \
+ " <string>$$PRODUCT_NAME</string>" \
" <key>CFBundleName</key>" \
- " <string>$${LITERAL_DOLLAR}{PRODUCT_NAME}</string>" \
+ " <string>$$PRODUCT_NAME</string>" \
" <key>CFBundleShortVersionString</key>" \
" <string>1.0</string>" \
" <key>CFBundleVersion</key>" \
diff --git a/src/gsttools/qgstreamerplayersession.cpp b/src/gsttools/qgstreamerplayersession.cpp
index 9858f61c9..1e099fc89 100644
--- a/src/gsttools/qgstreamerplayersession.cpp
+++ b/src/gsttools/qgstreamerplayersession.cpp
@@ -1886,7 +1886,7 @@ void QGstreamerPlayerSession::endOfMediaReset()
m_renderer->stopRenderer();
flushVideoProbes();
- gst_element_set_state(m_pipeline, GST_STATE_NULL);
+ gst_element_set_state(m_pipeline, GST_STATE_PAUSED);
QMediaPlayer::State oldState = m_state;
m_pendingState = m_state = QMediaPlayer::StoppedState;
diff --git a/src/multimediawidgets/qgraphicsvideoitem.cpp b/src/multimediawidgets/qgraphicsvideoitem.cpp
index 002fc2cc2..38f5c0e5b 100644
--- a/src/multimediawidgets/qgraphicsvideoitem.cpp
+++ b/src/multimediawidgets/qgraphicsvideoitem.cpp
@@ -376,11 +376,15 @@ void QGraphicsVideoItem::paint(
if (widget)
connect(widget, SIGNAL(destroyed()), d->surface, SLOT(viewportDestroyed()));
- d->surface->setGLContext(const_cast<QGLContext *>(QGLContext::currentContext()));
- if (d->surface->supportedShaderTypes() & QPainterVideoSurface::GlslShader) {
- d->surface->setShaderType(QPainterVideoSurface::GlslShader);
- } else {
- d->surface->setShaderType(QPainterVideoSurface::FragmentProgramShader);
+ if (painter->paintEngine()->type() == QPaintEngine::OpenGL
+ || painter->paintEngine()->type() == QPaintEngine::OpenGL2)
+ {
+ d->surface->setGLContext(const_cast<QGLContext *>(QGLContext::currentContext()));
+ if (d->surface->supportedShaderTypes() & QPainterVideoSurface::GlslShader) {
+ d->surface->setShaderType(QPainterVideoSurface::GlslShader);
+ } else {
+ d->surface->setShaderType(QPainterVideoSurface::FragmentProgramShader);
+ }
}
#endif
if (d->rendererControl && d->rendererControl->surface() != d->surface)
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()