diff options
author | Frederik Gladhorn <frederik.gladhorn@digia.com> | 2014-01-10 18:30:14 +0100 |
---|---|---|
committer | Frederik Gladhorn <frederik.gladhorn@digia.com> | 2014-01-10 18:30:14 +0100 |
commit | d2545bd40f0a4150f616f52b9138a34c60ed2d3c (patch) | |
tree | e9e76ae976a20a22ff400a1cdd0650bf90da45b9 | |
parent | b0481d4b47f96b157989203bf57ec7e8ca266513 (diff) | |
parent | da89319f3859b30cf4cf03a53b50677092138921 (diff) | |
download | qtmultimedia-d2545bd40f0a4150f616f52b9138a34c60ed2d3c.tar.gz qtmultimedia-d2545bd40f0a4150f616f52b9138a34c60ed2d3c.tar.bz2 qtmultimedia-d2545bd40f0a4150f616f52b9138a34c60ed2d3c.zip |
Merge remote-tracking branch 'origin/stable' into dev
Change-Id: I7dc36a224702721b67ffa2cf7f9ce2a6b047f88e
20 files changed, 267 insertions, 24 deletions
diff --git a/src/imports/multimedia/qdeclarativevideooutput.cpp b/src/imports/multimedia/qdeclarativevideooutput.cpp index 240dc469..6d6107e5 100644 --- a/src/imports/multimedia/qdeclarativevideooutput.cpp +++ b/src/imports/multimedia/qdeclarativevideooutput.cpp @@ -574,7 +574,7 @@ QRectF QDeclarativeVideoOutput::mapNormalizedRectToItem(const QRectF &rectangle) } /*! - \qmlmethod QPointF QtMultimedia::VideoOutput::mapPointToItem(const QPointF &point) const + \qmlmethod QPointF QtMultimedia::VideoOutput::mapPointToSource(const QPointF &point) const Given a point \a point in item coordinates, return the corresponding point in source coordinates. This mapping is @@ -612,7 +612,7 @@ QRectF QDeclarativeVideoOutput::mapRectToSource(const QRectF &rectangle) const } /*! - \qmlmethod QPointF QtMultimedia::VideoOutput::mapPointToItemNormalized(const QPointF &point) const + \qmlmethod QPointF QtMultimedia::VideoOutput::mapPointToSourceNormalized(const QPointF &point) const Given a point \a point in item coordinates, return the corresponding point in normalized source coordinates. This mapping is diff --git a/src/multimedia/audio/qaudiodeviceinfo.cpp b/src/multimedia/audio/qaudiodeviceinfo.cpp index 88d30899..ff31f353 100644 --- a/src/multimedia/audio/qaudiodeviceinfo.cpp +++ b/src/multimedia/audio/qaudiodeviceinfo.cpp @@ -127,7 +127,7 @@ public: order, channel, codec, frequency, sample rate, and sample type. A format is represented by the QAudioFormat class. - The values supported by the the device for each of these + The values supported by the device for each of these parameters can be fetched with supportedByteOrders(), supportedChannelCounts(), supportedCodecs(), supportedSampleRates(), supportedSampleSizes(), and diff --git a/src/multimedia/audio/qsoundeffect_pulse_p.cpp b/src/multimedia/audio/qsoundeffect_pulse_p.cpp index 8bac6c99..23e8d727 100644 --- a/src/multimedia/audio/qsoundeffect_pulse_p.cpp +++ b/src/multimedia/audio/qsoundeffect_pulse_p.cpp @@ -183,16 +183,17 @@ private Q_SLOTS: lock(); m_context = pa_context_new(m_mainLoopApi, QString(QLatin1String("QtPulseAudio:%1")).arg(::getpid()).toLatin1().constData()); - pa_context_set_state_callback(m_context, context_state_callback, this); - if (m_context == 0) { qWarning("PulseAudioService: Unable to create new pulseaudio context"); pa_threaded_mainloop_unlock(m_mainLoop); pa_threaded_mainloop_free(m_mainLoop); m_mainLoop = 0; + onContextFailed(); return; } + pa_context_set_state_callback(m_context, context_state_callback, this); + if (pa_context_connect(m_context, 0, (pa_context_flags_t)0, 0) < 0) { qWarning("PulseAudioService: pa_context_connect() failed"); pa_context_unref(m_context); diff --git a/src/multimedia/controls/qcameraimageprocessingcontrol.cpp b/src/multimedia/controls/qcameraimageprocessingcontrol.cpp index 7b2e3bba..f9cb8c86 100644 --- a/src/multimedia/controls/qcameraimageprocessingcontrol.cpp +++ b/src/multimedia/controls/qcameraimageprocessingcontrol.cpp @@ -120,8 +120,8 @@ QCameraImageProcessingControl::~QCameraImageProcessingControl() Returns true if the camera supports adjusting image processing \a parameter. - Usually the the supported settings is static, - but some parameter may not be available depending on other + Usually the supported setting is static, + but some parameters may not be available depending on other camera settings, like presets. In such case the currently supported parameters should be returned. */ @@ -129,7 +129,7 @@ QCameraImageProcessingControl::~QCameraImageProcessingControl() /*! \fn bool QCameraImageProcessingControl::isParameterValueSupported(ProcessingParameter parameter, const QVariant &value) const - Returns true if the camera supports settings the the image processing \a parameter \a value. + Returns true if the camera supports setting the image processing \a parameter \a value. It's used only for parameters with a limited set of values, like WhiteBalancePreset. */ diff --git a/src/multimedia/doc/src/blackberry.qdoc b/src/multimedia/doc/src/blackberry.qdoc index 4b494cb6..5af06365 100644 --- a/src/multimedia/doc/src/blackberry.qdoc +++ b/src/multimedia/doc/src/blackberry.qdoc @@ -59,7 +59,7 @@ supported in QMediaPlayer as well. Playlists as sources are also supported. mmrenderer does not allow access to the pixel data of video frames, hence Qt Multimedia classes like QVideoFrame and QAbstractVideoSurface will not work since they require access to the image data. QVideoWidget and the VideoOutput QML element are implemented with an overlay window; -mmrenderer creates a seperate window displaying a video and puts that on top of the Qt application. +mmrenderer creates a separate window displaying a video and puts that on top of the Qt application. As a consequence, no other widget or QML element can be put on top of the video, and QML shaders have no effect. diff --git a/src/multimedia/doc/src/changes.qdoc b/src/multimedia/doc/src/changes.qdoc index 10e9d92b..d517ef41 100644 --- a/src/multimedia/doc/src/changes.qdoc +++ b/src/multimedia/doc/src/changes.qdoc @@ -125,7 +125,7 @@ changed in ways that may affect previously written code. This table highlights s you will probably need to remove them. \row \li QSoundEffect availability - \li The SoundEffect QML type was publically accessible in Qt Multimeda Kit, + \li The SoundEffect QML type was publicly accessible in Qt Multimeda Kit, and now the C++ version is officially public too. If your code contains the previously undocumented QSoundEffect, you may need to update it. \row diff --git a/src/multimedia/playback/qmediaplaylist.cpp b/src/multimedia/playback/qmediaplaylist.cpp index 78f34503..68a8917f 100644 --- a/src/multimedia/playback/qmediaplaylist.cpp +++ b/src/multimedia/playback/qmediaplaylist.cpp @@ -88,7 +88,7 @@ namespace like QMediaPlayer. QMediaPlaylist allows to access the service intrinsic playlist functionality - if available, otherwise it provides the the local memory playlist implementation. + if available, otherwise it provides the local memory playlist implementation. \snippet multimedia-snippets/media.cpp Movie playlist diff --git a/src/multimedia/video/qabstractvideobuffer.cpp b/src/multimedia/video/qabstractvideobuffer.cpp index e20c4215..5f69382e 100644 --- a/src/multimedia/video/qabstractvideobuffer.cpp +++ b/src/multimedia/video/qabstractvideobuffer.cpp @@ -78,7 +78,7 @@ namespace a new hardware accelerated video system, for example. The contents of a buffer can be accessed by mapping the buffer to memory using the map() - function, which returns a pointer to memory containing the contents of the the video buffer. + function, which returns a pointer to memory containing the contents of the video buffer. The memory returned by map() is released by calling the unmap() function. The handle() of a buffer may also be used to manipulate its contents using type specific APIs. diff --git a/src/plugins/android/jar/src/org/qtproject/qt5/android/multimedia/QtCamera.java b/src/plugins/android/jar/src/org/qtproject/qt5/android/multimedia/QtCamera.java index 4aa07b71..f03053f1 100644 --- a/src/plugins/android/jar/src/org/qtproject/qt5/android/multimedia/QtCamera.java +++ b/src/plugins/android/jar/src/org/qtproject/qt5/android/multimedia/QtCamera.java @@ -60,6 +60,7 @@ public class QtCamera implements Camera.ShutterCallback, private int m_actualPreviewBuffer = 0; private final ReentrantLock m_buffersLock = new ReentrantLock(); private boolean m_isReleased = false; + private boolean m_fetchEachFrame = false; private static final String TAG = "Qt Camera"; @@ -141,6 +142,11 @@ public class QtCamera implements Camera.ShutterCallback, } } + public void fetchEachFrame(boolean fetch) + { + m_fetchEachFrame = fetch; + } + public void startPreview() { Camera.Size previewSize = m_camera.getParameters().getPreviewSize(); @@ -233,6 +239,10 @@ public class QtCamera implements Camera.ShutterCallback, public void onPreviewFrame(byte[] data, Camera camera) { m_buffersLock.lock(); + + if (data != null && m_fetchEachFrame) + notifyFrameFetched(m_cameraId, data); + if (data == m_cameraPreviewFirstBuffer) m_actualPreviewBuffer = 1; else if (data == m_cameraPreviewSecondBuffer) @@ -252,4 +262,5 @@ public class QtCamera implements Camera.ShutterCallback, private static native void notifyAutoFocusComplete(int id, boolean success); private static native void notifyPictureExposed(int id); private static native void notifyPictureCaptured(int id, byte[] data); + private static native void notifyFrameFetched(int id, byte[] data); } diff --git a/src/plugins/android/src/mediacapture/mediacapture.pri b/src/plugins/android/src/mediacapture/mediacapture.pri index d994bebf..242afe65 100644 --- a/src/plugins/android/src/mediacapture/mediacapture.pri +++ b/src/plugins/android/src/mediacapture/mediacapture.pri @@ -21,7 +21,8 @@ SOURCES += \ $$PWD/qandroidaudioencodersettingscontrol.cpp \ $$PWD/qandroidmediacontainercontrol.cpp \ $$PWD/qandroidvideoencodersettingscontrol.cpp \ - $$PWD/qandroidaudioinputselectorcontrol.cpp + $$PWD/qandroidaudioinputselectorcontrol.cpp \ + $$PWD/qandroidmediavideoprobecontrol.cpp HEADERS += \ $$PWD/qandroidcaptureservice.h \ @@ -44,4 +45,5 @@ HEADERS += \ $$PWD/qandroidaudioencodersettingscontrol.h \ $$PWD/qandroidmediacontainercontrol.h \ $$PWD/qandroidvideoencodersettingscontrol.h \ - $$PWD/qandroidaudioinputselectorcontrol.h + $$PWD/qandroidaudioinputselectorcontrol.h \ + $$PWD/qandroidmediavideoprobecontrol.h diff --git a/src/plugins/android/src/mediacapture/qandroidcamerasession.cpp b/src/plugins/android/src/mediacapture/qandroidcamerasession.cpp index cb528239..86c5e312 100644 --- a/src/plugins/android/src/mediacapture/qandroidcamerasession.cpp +++ b/src/plugins/android/src/mediacapture/qandroidcamerasession.cpp @@ -44,11 +44,13 @@ #include "jcamera.h" #include "jmultimediautils.h" #include "qandroidvideooutput.h" +#include "qandroidmediavideoprobecontrol.h" #include "qandroidmultimediautils.h" #include <QtConcurrent/qtconcurrentrun.h> #include <qfile.h> #include <qguiapplication.h> #include <qdebug.h> +#include <qvideoframe.h> QT_BEGIN_NAMESPACE @@ -183,6 +185,9 @@ bool QAndroidCameraSession::open() if (m_camera) { connect(m_camera, SIGNAL(pictureExposed()), this, SLOT(onCameraPictureExposed())); connect(m_camera, SIGNAL(previewFetched(QByteArray)), this, SLOT(onCameraPreviewFetched(QByteArray))); + connect(m_camera, SIGNAL(frameFetched(QByteArray)), + this, SLOT(onCameraFrameFetched(QByteArray)), + Qt::DirectConnection); connect(m_camera, SIGNAL(pictureCaptured(QByteArray)), this, SLOT(onCameraPictureCaptured(QByteArray))); connect(m_camera, SIGNAL(previewStarted()), this, SLOT(onCameraPreviewStarted())); connect(m_camera, SIGNAL(previewStopped()), this, SLOT(onCameraPreviewStopped())); @@ -200,6 +205,8 @@ bool QAndroidCameraSession::open() if (m_camera->getPreviewFormat() != JCamera::NV21) m_camera->setPreviewFormat(JCamera::NV21); + m_camera->fetchEachFrame(m_videoProbes.count()); + emit opened(); } else { m_status = QCamera::UnavailableStatus; @@ -364,6 +371,25 @@ int QAndroidCameraSession::currentCameraRotation() const return rotation; } +void QAndroidCameraSession::addProbe(QAndroidMediaVideoProbeControl *probe) +{ + m_videoProbesMutex.lock(); + if (probe) + m_videoProbes << probe; + if (m_camera) + m_camera->fetchEachFrame(m_videoProbes.count()); + m_videoProbesMutex.unlock(); +} + +void QAndroidCameraSession::removeProbe(QAndroidMediaVideoProbeControl *probe) +{ + m_videoProbesMutex.lock(); + m_videoProbes.remove(probe); + if (m_camera) + m_camera->fetchEachFrame(m_videoProbes.count()); + m_videoProbesMutex.unlock(); +} + void QAndroidCameraSession::applyImageSettings() { if (!m_camera || !m_imageSettingsDirty) @@ -513,6 +539,19 @@ void QAndroidCameraSession::onCameraPreviewFetched(const QByteArray &preview) } } +void QAndroidCameraSession::onCameraFrameFetched(const QByteArray &frame) +{ + m_videoProbesMutex.lock(); + if (frame.size() && m_videoProbes.count()) { + QVideoFrame videoFrame(new DataVideoBuffer(frame), + m_camera->previewSize(), + QVideoFrame::Format_NV21); + foreach (QAndroidMediaVideoProbeControl *probe, m_videoProbes) + probe->newFrameProbed(videoFrame); + } + m_videoProbesMutex.unlock(); +} + void QAndroidCameraSession::onCameraPictureCaptured(const QByteArray &data) { if (!m_captureCanceled) { @@ -593,10 +632,15 @@ void QAndroidCameraSession::processCapturedImage(int id, void QAndroidCameraSession::processPreviewImage(int id, const QByteArray &data, int rotation) { + emit imageCaptured(id, prepareImageFromPreviewData(data, rotation)); +} + +QImage QAndroidCameraSession::prepareImageFromPreviewData(const QByteArray &data, int rotation) +{ QSize frameSize = m_camera->previewSize(); - QImage preview(frameSize, QImage::Format_ARGB32); + QImage result(frameSize, QImage::Format_ARGB32); qt_convert_NV21_to_ARGB32((const uchar *)data.constData(), - (quint32 *)preview.bits(), + (quint32 *)result.bits(), frameSize.width(), frameSize.height()); @@ -610,9 +654,9 @@ void QAndroidCameraSession::processPreviewImage(int id, const QByteArray &data, transform.rotate(rotation); - preview = preview.transformed(transform); + result = result.transformed(transform); - emit imageCaptured(id, preview); + return result; } void QAndroidCameraSession::onVideoOutputReady(bool ready) diff --git a/src/plugins/android/src/mediacapture/qandroidcamerasession.h b/src/plugins/android/src/mediacapture/qandroidcamerasession.h index a621404a..e0fd93cd 100644 --- a/src/plugins/android/src/mediacapture/qandroidcamerasession.h +++ b/src/plugins/android/src/mediacapture/qandroidcamerasession.h @@ -45,12 +45,15 @@ #include <qcamera.h> #include <qmediaencodersettings.h> #include <QCameraImageCapture> +#include <QSet> +#include <QMutex> #include "qandroidmediastoragelocation.h" QT_BEGIN_NAMESPACE class JCamera; class QAndroidVideoOutput; +class QAndroidMediaVideoProbeControl; class QAndroidCameraSession : public QObject { @@ -90,6 +93,9 @@ public: int currentCameraRotation() const; + void addProbe(QAndroidMediaVideoProbeControl *probe); + void removeProbe(QAndroidMediaVideoProbeControl *probe); + Q_SIGNALS: void statusChanged(QCamera::Status status); void stateChanged(QCamera::State); @@ -114,6 +120,7 @@ private Q_SLOTS: void onCameraPictureExposed(); void onCameraPreviewFetched(const QByteArray &preview); + void onCameraFrameFetched(const QByteArray &frame); void onCameraPictureCaptured(const QByteArray &data); void onCameraPreviewStarted(); void onCameraPreviewStopped(); @@ -127,6 +134,7 @@ private: void applyImageSettings(); void processPreviewImage(int id, const QByteArray &data, int rotation); + QImage prepareImageFromPreviewData(const QByteArray &data, int rotation); void processCapturedImage(int id, const QByteArray &data, const QSize &resolution, @@ -156,6 +164,9 @@ private: QString m_currentImageCaptureFileName; QAndroidMediaStorageLocation m_mediaStorageLocation; + + QSet<QAndroidMediaVideoProbeControl *> m_videoProbes; + QMutex m_videoProbesMutex; }; QT_END_NAMESPACE diff --git a/src/plugins/android/src/mediacapture/qandroidcaptureservice.cpp b/src/plugins/android/src/mediacapture/qandroidcaptureservice.cpp index 3468c64e..4a38ff5e 100644 --- a/src/plugins/android/src/mediacapture/qandroidcaptureservice.cpp +++ b/src/plugins/android/src/mediacapture/qandroidcaptureservice.cpp @@ -61,6 +61,7 @@ #include "qandroidaudioencodersettingscontrol.h" #include "qandroidvideoencodersettingscontrol.h" #include "qandroidmediacontainercontrol.h" +#include "qandroidmediavideoprobecontrol.h" #include <qmediaserviceproviderplugin.h> @@ -201,16 +202,37 @@ QMediaControl *QAndroidCaptureService::requestControl(const char *name) return m_videoRendererControl; } + if (qstrcmp(name,QMediaVideoProbeControl_iid) == 0) { + QAndroidMediaVideoProbeControl *videoProbe = 0; + if (m_cameraSession) { + videoProbe = new QAndroidMediaVideoProbeControl(this); + m_cameraSession->addProbe(videoProbe); + } + return videoProbe; + } + return 0; } void QAndroidCaptureService::releaseControl(QMediaControl *control) { - if (control && control == m_videoRendererControl) { - m_cameraSession->setVideoPreview(0); - delete m_videoRendererControl; - m_videoRendererControl = 0; + if (control) { + if (control == m_videoRendererControl) { + m_cameraSession->setVideoPreview(0); + delete m_videoRendererControl; + m_videoRendererControl = 0; + return; + } + + QAndroidMediaVideoProbeControl *videoProbe = qobject_cast<QAndroidMediaVideoProbeControl *>(control); + if (videoProbe) { + if (m_cameraSession) + m_cameraSession->removeProbe(videoProbe); + delete videoProbe; + return; + } } + } QT_END_NAMESPACE diff --git a/src/plugins/android/src/mediacapture/qandroidmediavideoprobecontrol.cpp b/src/plugins/android/src/mediacapture/qandroidmediavideoprobecontrol.cpp new file mode 100644 index 00000000..a4ebc8fe --- /dev/null +++ b/src/plugins/android/src/mediacapture/qandroidmediavideoprobecontrol.cpp @@ -0,0 +1,59 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2013 Integrated Computer Solutions, Inc +** Contact: http://www.qt-project.org/legal +** +** This file is part of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qandroidmediavideoprobecontrol.h" +#include <qvideoframe.h> + +QAndroidMediaVideoProbeControl::QAndroidMediaVideoProbeControl(QObject *parent) : + QMediaVideoProbeControl(parent) +{ +} + +QAndroidMediaVideoProbeControl::~QAndroidMediaVideoProbeControl() +{ + +} + +void QAndroidMediaVideoProbeControl::newFrameProbed(const QVideoFrame &frame) +{ + emit videoFrameProbed(frame); +} diff --git a/src/plugins/android/src/mediacapture/qandroidmediavideoprobecontrol.h b/src/plugins/android/src/mediacapture/qandroidmediavideoprobecontrol.h new file mode 100644 index 00000000..7bb34d88 --- /dev/null +++ b/src/plugins/android/src/mediacapture/qandroidmediavideoprobecontrol.h @@ -0,0 +1,59 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2013 Integrated Computer Solutions, Inc +** Contact: http://www.qt-project.org/legal +** +** This file is part of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QANDROIDMEDIAVIDEOPROBECONTROL_H +#define QANDROIDMEDIAVIDEOPROBECONTROL_H + +#include <qmediavideoprobecontrol.h> + +class QAndroidMediaVideoProbeControl : public QMediaVideoProbeControl +{ + Q_OBJECT +public: + explicit QAndroidMediaVideoProbeControl(QObject *parent = 0); + virtual ~QAndroidMediaVideoProbeControl(); + + void newFrameProbed(const QVideoFrame& frame); + +}; + +#endif // QANDROIDMEDIAVIDEOPROBECONTROL_H diff --git a/src/plugins/android/src/wrappers/jcamera.cpp b/src/plugins/android/src/wrappers/jcamera.cpp index 0c7455fa..d24a59a3 100644 --- a/src/plugins/android/src/wrappers/jcamera.cpp +++ b/src/plugins/android/src/wrappers/jcamera.cpp @@ -111,6 +111,21 @@ static void notifyPictureCaptured(JNIEnv *env, jobject, int id, jbyteArray data) } } +static void notifyFrameFetched(JNIEnv *env, jobject, int id, jbyteArray data) +{ + g_objectMapMutex.lock(); + JCamera *obj = g_objectMap.value(id, 0); + g_objectMapMutex.unlock(); + if (obj) { + QByteArray bytes; + int arrayLength = env->GetArrayLength(data); + bytes.resize(arrayLength); + env->GetByteArrayRegion(data, 0, arrayLength, (jbyte*)bytes.data()); + + Q_EMIT obj->frameFetched(bytes); + } +} + class JCameraInstantiator : public QObject { Q_OBJECT @@ -201,6 +216,7 @@ class JCameraWorker : public QObject, public QJNIObjectPrivate Q_INVOKABLE void startPreview(); Q_INVOKABLE void stopPreview(); + Q_INVOKABLE void fetchEachFrame(bool fetch); Q_INVOKABLE void fetchLastPreviewFrame(); Q_INVOKABLE void applyParameters(); @@ -571,6 +587,11 @@ void JCamera::takePicture() QMetaObject::invokeMethod(d, "callVoidMethod", Q_ARG(QByteArray, "takePicture")); } +void JCamera::fetchEachFrame(bool fetch) +{ + QMetaObject::invokeMethod(d, "fetchEachFrame", Q_ARG(bool, fetch)); +} + void JCamera::fetchLastPreviewFrame() { QMetaObject::invokeMethod(d, "fetchLastPreviewFrame"); @@ -1165,6 +1186,11 @@ void JCameraWorker::stopPreview() emit previewStopped(); } +void JCameraWorker::fetchEachFrame(bool fetch) +{ + callMethod<void>("fetchEachFrame", "(Z)V", fetch); +} + void JCameraWorker::fetchLastPreviewFrame() { QJNIEnvironmentPrivate env; @@ -1224,7 +1250,8 @@ void JCameraWorker::callVoidMethod(const QByteArray &methodName) static JNINativeMethod methods[] = { {"notifyAutoFocusComplete", "(IZ)V", (void *)notifyAutoFocusComplete}, {"notifyPictureExposed", "(I)V", (void *)notifyPictureExposed}, - {"notifyPictureCaptured", "(I[B)V", (void *)notifyPictureCaptured} + {"notifyPictureCaptured", "(I[B)V", (void *)notifyPictureCaptured}, + {"notifyFrameFetched", "(I[B)V", (void *)notifyFrameFetched} }; bool JCamera::initJNI(JNIEnv *env) diff --git a/src/plugins/android/src/wrappers/jcamera.h b/src/plugins/android/src/wrappers/jcamera.h index 9b2f5b17..535efe21 100644 --- a/src/plugins/android/src/wrappers/jcamera.h +++ b/src/plugins/android/src/wrappers/jcamera.h @@ -155,6 +155,7 @@ public: void takePicture(); + void fetchEachFrame(bool fetch); void fetchLastPreviewFrame(); QJNIObjectPrivate getCameraObject(); @@ -173,6 +174,7 @@ Q_SIGNALS: void pictureExposed(); void pictureCaptured(const QByteArray &data); void previewFetched(const QByteArray &preview); + void frameFetched(const QByteArray &frame); private: JCamera(int cameraId, jobject cam, QThread *workerThread); diff --git a/src/plugins/gstreamer/mediacapture/qgstreamerrecordercontrol.cpp b/src/plugins/gstreamer/mediacapture/qgstreamerrecordercontrol.cpp index f08ba328..25744215 100644 --- a/src/plugins/gstreamer/mediacapture/qgstreamerrecordercontrol.cpp +++ b/src/plugins/gstreamer/mediacapture/qgstreamerrecordercontrol.cpp @@ -98,11 +98,14 @@ QMediaRecorder::Status QGstreamerRecorderControl::status() const switch ( m_session->state() ) { case QGstreamerCaptureSession::RecordingState: sessionState = QMediaRecorder::RecordingState; + break; case QGstreamerCaptureSession::PausedState: sessionState = QMediaRecorder::PausedState; + break; case QGstreamerCaptureSession::PreviewState: case QGstreamerCaptureSession::StoppedState: sessionState = QMediaRecorder::StoppedState; + break; } return statusTable[m_state][sessionState]; diff --git a/src/plugins/qnx/mediaplayer/mmrenderermediaplayercontrol.cpp b/src/plugins/qnx/mediaplayer/mmrenderermediaplayercontrol.cpp index 2a376198..e8000179 100644 --- a/src/plugins/qnx/mediaplayer/mmrenderermediaplayercontrol.cpp +++ b/src/plugins/qnx/mediaplayer/mmrenderermediaplayercontrol.cpp @@ -530,7 +530,7 @@ void MmRendererMediaPlayerControl::play() } setPositionInternal(m_position); - setVolumeInternal(m_volume); + setVolumeInternal(m_muted ? 0 : m_volume); setPlaybackRateInternal(m_rate); if (mmr_play(m_context) != 0) { diff --git a/tests/auto/integration/qcamerabackend/qcamerabackend.pro b/tests/auto/integration/qcamerabackend/qcamerabackend.pro index 1a0c44ea..c39ce9c4 100644 --- a/tests/auto/integration/qcamerabackend/qcamerabackend.pro +++ b/tests/auto/integration/qcamerabackend/qcamerabackend.pro @@ -8,3 +8,5 @@ CONFIG += testcase SOURCES += tst_qcamerabackend.cpp DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 + +mac: CONFIG += insignificant_test # QTBUG-36040 |