diff options
-rw-r--r-- | examples/multimedia/shared/shared.pri | 6 | ||||
-rw-r--r-- | src/gsttools/qgstreamerplayersession.cpp | 2 | ||||
-rw-r--r-- | src/multimediawidgets/qgraphicsvideoitem.cpp | 14 | ||||
-rw-r--r-- | src/plugins/android/src/mediacapture/qandroidcamerasession.cpp | 43 | ||||
-rw-r--r-- | src/plugins/android/src/wrappers/jni/androidcamera.cpp | 12 |
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() |