summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Goddard <michael.goddard@nokia.com>2012-01-27 15:02:31 +1000
committerQt by Nokia <qt-info@nokia.com>2012-02-07 05:01:24 +0100
commit8b1f11b370b346af65b712502d68d6febaae5f12 (patch)
tree696938235b8d462170b740abfc86890ae3820437
parent6c51d2aadf66c0ebeb66ae04e666359ee4b7423c (diff)
Add some media probing API.
Change-Id: Ib83918f99b699ac3fbc7ede82a392d00d4c18005 Reviewed-by: Jonas Rabbe <jonas.rabbe@nokia.com>
-rw-r--r--src/multimedia/audio/audio.pri6
-rw-r--r--src/multimedia/audio/qaudioprobe.cpp188
-rw-r--r--src/multimedia/audio/qaudioprobe.h81
-rw-r--r--src/multimedia/controls/controls.pri8
-rw-r--r--src/multimedia/controls/qmediaaudioprobecontrol.cpp97
-rw-r--r--src/multimedia/controls/qmediaaudioprobecontrol.h75
-rw-r--r--src/multimedia/controls/qmediavideoprobecontrol.cpp97
-rw-r--r--src/multimedia/controls/qmediavideoprobecontrol.h77
-rw-r--r--src/multimedia/video/qvideoprobe.cpp193
-rw-r--r--src/multimedia/video/qvideoprobe.h81
-rw-r--r--src/multimedia/video/video.pri9
11 files changed, 906 insertions, 6 deletions
diff --git a/src/multimedia/audio/audio.pri b/src/multimedia/audio/audio.pri
index a1cfa0b4..33fd5a8d 100644
--- a/src/multimedia/audio/audio.pri
+++ b/src/multimedia/audio/audio.pri
@@ -10,7 +10,8 @@ PUBLIC_HEADERS += \
audio/qaudiosystemplugin.h \
audio/qaudiosystem.h \
audio/qsoundeffect.h \
- audio/qsound.h
+ audio/qsound.h \
+ audio/qaudioprobe.h
PRIVATE_HEADERS += \
audio/qaudiobuffer_p.h \
@@ -33,7 +34,8 @@ SOURCES += \
audio/qwavedecoder_p.cpp \
audio/qsamplecache_p.cpp \
audio/qsound.cpp \
- audio/qaudiobuffer.cpp
+ audio/qaudiobuffer.cpp \
+ audio/qaudioprobe.cpp
mac {
PRIVATE_HEADERS += audio/qaudioinput_mac_p.h \
diff --git a/src/multimedia/audio/qaudioprobe.cpp b/src/multimedia/audio/qaudioprobe.cpp
new file mode 100644
index 00000000..e51c56a7
--- /dev/null
+++ b/src/multimedia/audio/qaudioprobe.cpp
@@ -0,0 +1,188 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** 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, Nokia gives you certain additional
+** rights. These rights are described in the Nokia 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.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \class QAudioProbe
+ \inmodule QtMultimedia
+
+ \ingroup multimedia
+ \ingroup multimedia_video
+
+ \brief The QAudioProbe class allows you to monitor audio being played or recorded.
+
+ \code
+ QAudioRecorder *recorder = new QAudioRecorder();
+ QAudioProbe *probe = new QAudioProbe;
+
+ // ... configure the audio recorder (skipped)
+
+ connect(probe, SIGNAL(audioBufferProbed(QAudioBuffer)), this, SLOT(processBuffer(QAudioBuffer)));
+
+ probe->setSource(recorder); // Returns true, hopefully.
+
+ recorder->record(); // Now we can do things like calculating levels or performing an FFT
+ \endcode
+
+ \sa QVideoProbe, QMediaPlayer, QCamera
+*/
+
+#include "qaudioprobe.h"
+#include "qmediaaudioprobecontrol.h"
+#include "qmediaservice.h"
+#include "qmediarecorder.h"
+#include "qsharedpointer.h"
+
+QT_BEGIN_NAMESPACE
+
+class QAudioProbePrivate {
+public:
+ QWeakPointer<QMediaObject> source;
+ QWeakPointer<QMediaAudioProbeControl> probee;
+};
+
+/*!
+ Creates a new QAudioProbe class. After setting the
+ source to monitor with \l setSource(), the \l audioBufferProbed()
+ signal will be emitted when audio buffers are flowing in the
+ source media object.
+ */
+QAudioProbe::QAudioProbe(QObject *parent)
+ : QObject(parent)
+ , d(new QAudioProbePrivate)
+{
+}
+
+/*!
+ Destroys this probe and disconnects from any
+ media object.
+ */
+QAudioProbe::~QAudioProbe()
+{
+ if (d->source) {
+ // Disconnect
+ if (d->probee)
+ disconnect(d->probee.data(), SIGNAL(audioBufferProbed(QAudioBuffer)), this, SIGNAL(audioBufferProbed(QAudioBuffer)));
+ d->source.data()->service()->releaseControl(d->probee.data());
+ }
+}
+
+/*!
+ Sets the media object to monitor to \a source.
+
+ If \a source is zero, this probe will be deactivated
+ and this function wil return true.
+
+ If the media object does not support monitoring
+ audio, this function will return false.
+
+ The previous object will no longer be monitored.
+ Passing in the same object will be ignored, but
+ monitoring will continue.
+ */
+bool QAudioProbe::setSource(QMediaObject *source)
+{
+ // Need to:
+ // 1) disconnect from current source if necessary
+ // 2) see if new one has the probe control
+ // 3) connect if so
+ if (source != d->source.data()) {
+ if (d->source) {
+ Q_ASSERT(d->probee);
+ disconnect(d->probee.data(), SIGNAL(audioBufferProbed(QAudioBuffer)), this, SIGNAL(audioBufferProbed(QAudioBuffer)));
+ d->source.data()->service()->releaseControl(d->probee.data());
+ d->source.clear();
+ d->probee.clear();
+ }
+
+ if (source) {
+ QMediaService *service = source->service();
+ if (service) {
+ d->probee = service->requestControl<QMediaAudioProbeControl*>();
+ }
+
+ if (d->probee) {
+ connect(d->probee.data(), SIGNAL(audioBufferProbed(QAudioBuffer)), this, SIGNAL(audioBufferProbed(QAudioBuffer)));
+ d->source = source;
+ }
+ }
+ }
+
+ return (!source || d->probee != 0);
+}
+
+/*!
+ Starts monitoring the given \a mediaRecorder.
+
+ If \a source is zero, this probe will be deactivated
+ and this function wil return true.
+
+ If the media recorder instance does not support monitoring
+ audio, this function will return false.
+
+ Any previously monitored objects will no longer be monitored.
+ Passing in the same object will be ignored, but
+ monitoring will continue.
+ */
+bool QAudioProbe::setSource(QMediaRecorder *mediaRecorder)
+{
+ QMediaObject *source = mediaRecorder ? mediaRecorder->mediaObject() : 0;
+ bool result = setSource(source);
+
+ if (!mediaRecorder)
+ return true;
+
+ if (mediaRecorder && !source)
+ return false;
+
+ return result;
+}
+
+/*!
+ Returns true if this probe is monitoring something, or false otherwise.
+
+ The source being monitored does not need to be active.
+ */
+bool QAudioProbe::isActive() const
+{
+ return d->probee != 0;
+}
+
+QT_END_NAMESPACE
diff --git a/src/multimedia/audio/qaudioprobe.h b/src/multimedia/audio/qaudioprobe.h
new file mode 100644
index 00000000..1b201ac6
--- /dev/null
+++ b/src/multimedia/audio/qaudioprobe.h
@@ -0,0 +1,81 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** 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, Nokia gives you certain additional
+** rights. These rights are described in the Nokia 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.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QAUDIOPROBE_H
+#define QAUDIOPROBE_H
+
+#include <QObject>
+#include <qaudiobuffer.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Multimedia)
+
+class QMediaObject;
+class QMediaRecorder;
+
+class QAudioProbePrivate;
+class QAudioProbe : public QObject
+{
+ Q_OBJECT
+public:
+ explicit QAudioProbe(QObject *parent = 0);
+ ~QAudioProbe();
+
+ bool setSource(QMediaObject *source);
+ bool setSource(QMediaRecorder *source);
+
+ bool isActive() const;
+
+Q_SIGNALS:
+ void audioBufferProbed(const QAudioBuffer &audioBuffer);
+
+private:
+ QAudioProbePrivate *d;
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // QAUDIOPROBE_H
diff --git a/src/multimedia/controls/controls.pri b/src/multimedia/controls/controls.pri
index 25d94c11..87ce6b3f 100644
--- a/src/multimedia/controls/controls.pri
+++ b/src/multimedia/controls/controls.pri
@@ -31,7 +31,9 @@ PUBLIC_HEADERS += \
controls/qradiotunercontrol.h \
controls/qvideodevicecontrol.h \
controls/qvideoencodercontrol.h \
- controls/qvideorenderercontrol.h
+ controls/qvideorenderercontrol.h \
+ controls/qmediaaudioprobecontrol.h \
+ controls/qmediavideoprobecontrol.h
SOURCES += \
controls/qaudioencodercontrol.cpp \
@@ -63,4 +65,6 @@ SOURCES += \
controls/qradiotunercontrol.cpp \
controls/qvideodevicecontrol.cpp \
controls/qvideoencodercontrol.cpp \
- controls/qvideorenderercontrol.cpp
+ controls/qvideorenderercontrol.cpp \
+ controls/qmediaaudioprobecontrol.cpp \
+ controls/qmediavideoprobecontrol.cpp
diff --git a/src/multimedia/controls/qmediaaudioprobecontrol.cpp b/src/multimedia/controls/qmediaaudioprobecontrol.cpp
new file mode 100644
index 00000000..dc32cbab
--- /dev/null
+++ b/src/multimedia/controls/qmediaaudioprobecontrol.cpp
@@ -0,0 +1,97 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** 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, Nokia gives you certain additional
+** rights. These rights are described in the Nokia 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.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qmediaaudioprobecontrol.h"
+#include "qmediacontrol_p.h"
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \class QMediaAudioProbeControl
+ \inmodule QtMultimedia
+
+ \ingroup multimedia
+ \ingroup multimedia_control
+
+ \brief The QMediaAudioProbeControl class allows control over probing audio data in media objects.
+
+ \l QAudioProbe is the client facing class for probing audio - this class is implemented by
+ media backends to provide this functionality.
+
+ The interface name of QMediaAudioProbeControl is \c com.nokia.Qt.QMediaAudioProbeControl/1.0 as
+ defined in QMediaAudioProbeControl_iid.
+
+ \sa QAudioProbe, QMediaService::requestControl(), QMediaPlayer, QCamera
+*/
+
+/*!
+ \macro QMediaAudioProbeControl_iid
+
+ \c com.nokia.Qt.QMediaAudioProbeControl/1.0
+
+ Defines the interface name of the QMediaAudioProbeControl class.
+
+ \relates QMediaAudioProbeControl
+*/
+
+/*!
+ Create a new media audio probe control object with the given \a parent.
+*/
+QMediaAudioProbeControl::QMediaAudioProbeControl(QObject *parent)
+ : QMediaControl(*new QMediaControlPrivate, parent)
+{
+}
+
+/*! Destroys this audio probe control */
+QMediaAudioProbeControl::~QMediaAudioProbeControl()
+{
+}
+
+/*!
+ \fn QMediaAudioProbeControl::audioBufferProbed(const QAudioBuffer &buffer)
+
+ This signal should be emitted when an audio buffer is processed in the
+ media service.
+*/
+
+#include "moc_qmediaaudioprobecontrol.cpp"
+
+QT_END_NAMESPACE
diff --git a/src/multimedia/controls/qmediaaudioprobecontrol.h b/src/multimedia/controls/qmediaaudioprobecontrol.h
new file mode 100644
index 00000000..c2198d14
--- /dev/null
+++ b/src/multimedia/controls/qmediaaudioprobecontrol.h
@@ -0,0 +1,75 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** 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, Nokia gives you certain additional
+** rights. These rights are described in the Nokia 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.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QMEDIAAUDIOPROBECONTROL_H
+#define QMEDIAAUDIOPROBECONTROL_H
+
+#include "qmediacontrol.h"
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Multimedia)
+
+class QAudioBuffer;
+class QMediaAudioProbeControl : public QMediaControl
+{
+ Q_OBJECT
+public:
+ virtual ~QMediaAudioProbeControl();
+
+signals:
+ void audioBufferProbed(const QAudioBuffer &buffer);
+
+protected:
+ explicit QMediaAudioProbeControl(QObject *parent = 0);
+};
+
+#define QMediaAudioProbeControl_iid "com.nokia.Qt.QMediaAudioProbeControl/1.0"
+Q_MEDIA_DECLARE_CONTROL(QMediaAudioProbeControl, QMediaAudioProbeControl_iid)
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+
+#endif // QMEDIAAUDIOPROBECONTROL_H
diff --git a/src/multimedia/controls/qmediavideoprobecontrol.cpp b/src/multimedia/controls/qmediavideoprobecontrol.cpp
new file mode 100644
index 00000000..f42e17ab
--- /dev/null
+++ b/src/multimedia/controls/qmediavideoprobecontrol.cpp
@@ -0,0 +1,97 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** 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, Nokia gives you certain additional
+** rights. These rights are described in the Nokia 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.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qmediavideoprobecontrol.h"
+#include "qmediacontrol_p.h"
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \class QMediaVideoProbeControl
+ \inmodule QtMultimedia
+
+ \ingroup multimedia
+ \ingroup multimedia_control
+
+ \brief The QMediaVideoProbeControl class allows control over probing video frames in media objects.
+
+ \l QVideoProbe is the client facing class for probing video - this class is implemented by
+ media backends to provide this functionality.
+
+ The interface name of QMediaVideoProbeControl is \c com.nokia.Qt.QMediaVideoProbeControl/1.0 as
+ defined in QMediaVideoProbeControl_iid.
+
+ \sa QVideoProbe, QMediaService::requestControl(), QMediaPlayer, QCamera
+*/
+
+/*!
+ \macro QMediaVideoProbeControl_iid
+
+ \c com.nokia.Qt.QMediaVideoProbeControl/1.0
+
+ Defines the interface name of the QMediaVideoProbeControl class.
+
+ \relates QMediaVideoProbeControl
+*/
+
+/*!
+ Create a new media video probe control object with the given \a parent.
+*/
+QMediaVideoProbeControl::QMediaVideoProbeControl(QObject *parent)
+ : QMediaControl(*new QMediaControlPrivate, parent)
+{
+}
+
+/*! Destroys this video probe control */
+QMediaVideoProbeControl::~QMediaVideoProbeControl()
+{
+}
+
+/*!
+ \fn QMediaVideoProbeControl::videoFrameProbed(const QVideoFrame &frame)
+
+ This signal should be emitted when a video frame is processed in the
+ media service.
+*/
+
+#include "moc_qmediavideoprobecontrol.cpp"
+
+QT_END_NAMESPACE
diff --git a/src/multimedia/controls/qmediavideoprobecontrol.h b/src/multimedia/controls/qmediavideoprobecontrol.h
new file mode 100644
index 00000000..b1575a5a
--- /dev/null
+++ b/src/multimedia/controls/qmediavideoprobecontrol.h
@@ -0,0 +1,77 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** 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, Nokia gives you certain additional
+** rights. These rights are described in the Nokia 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.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+
+#ifndef QMEDIAVIDEOPROBECONTROL_H
+#define QMEDIAVIDEOPROBECONTROL_H
+
+#include "qmediacontrol.h"
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Multimedia)
+
+class QVideoFrame;
+class QMediaVideoProbeControl : public QMediaControl
+{
+ Q_OBJECT
+public:
+ virtual ~QMediaVideoProbeControl();
+
+signals:
+ void videoFrameProbed(const QVideoFrame &frame);
+
+protected:
+ explicit QMediaVideoProbeControl(QObject *parent = 0);
+};
+
+#define QMediaVideoProbeControl_iid "com.nokia.Qt.QMediaVideoProbeControl/1.0"
+Q_MEDIA_DECLARE_CONTROL(QMediaVideoProbeControl, QMediaVideoProbeControl_iid)
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+
+#endif // QMEDIAVIDEOPROBECONTROL_H
diff --git a/src/multimedia/video/qvideoprobe.cpp b/src/multimedia/video/qvideoprobe.cpp
new file mode 100644
index 00000000..d9d0d658
--- /dev/null
+++ b/src/multimedia/video/qvideoprobe.cpp
@@ -0,0 +1,193 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** 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, Nokia gives you certain additional
+** rights. These rights are described in the Nokia 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.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+/*!
+ \class QVideoProbe
+ \inmodule QtMultimedia
+
+ \ingroup multimedia
+ \ingroup multimedia_video
+
+ \brief The QVideoProbe class allows you to monitor video frames being played or recorded.
+
+ \code
+ QMediaPlayer *player = new QMediaPlayer();
+ QVideoProbe *probe = new QVideoProbe;
+
+ connect(probe, SIGNAL(videoFrameProbed(QVideoFrame)), this, SLOT(processFrame(QVideoFrame)));
+
+ probe->setSource(player); // Returns true, hopefully.
+
+ player->setVideoOutput(myVideoSurface);
+ player->setMedia(QUrl::fromLocalFile("observation.mp4"));
+ player->play(); // Start receving frames as they get presented to myVideoSurface
+ \endcode
+
+ This same approach works with the QCamera object as well, to receive viewfinder or video
+ frames as they are captured.
+
+ \sa QAudioProbe, QMediaPlayer, QCamera
+*/
+
+#include "qvideoprobe.h"
+#include "qmediavideoprobecontrol.h"
+#include "qmediaservice.h"
+#include "qmediarecorder.h"
+#include "qsharedpointer.h"
+
+QT_BEGIN_NAMESPACE
+
+class QVideoProbePrivate {
+public:
+ QWeakPointer<QMediaObject> source;
+ QWeakPointer<QMediaVideoProbeControl> probee;
+};
+
+/*!
+ Creates a new QVideoProbe class. After setting the
+ source to monitor with \l setSource(), the \l videoFrameProbed()
+ signal will be emitted when video frames are flowing in the
+ source media object.
+ */
+QVideoProbe::QVideoProbe(QObject *parent)
+ : QObject(parent)
+ , d(new QVideoProbePrivate)
+{
+
+}
+
+/*!
+ Destroys this probe and disconnects from any
+ media object.
+ */
+QVideoProbe::~QVideoProbe()
+{
+ if (d->source) {
+ // Disconnect
+ if (d->probee)
+ disconnect(d->probee.data(), SIGNAL(videoFrameProbed(QVideoFrame)), this, SIGNAL(videoFrameProbed(QVideoFrame)));
+ d->source.data()->service()->releaseControl(d->probee.data());
+ }
+}
+
+/*!
+ Sets the media object to monitor to \a source.
+
+ If \a source is zero, this probe will be deactivated
+ and this function wil return true.
+
+ If the media object does not support monitoring
+ video, this function will return false.
+
+ Any previously monitored objects will no longer be monitored.
+ Passing in the same object will be ignored, but
+ monitoring will continue.
+ */
+bool QVideoProbe::setSource(QMediaObject *source)
+{
+ // Need to:
+ // 1) disconnect from current source if necessary
+ // 2) see if new one has the probe control
+ // 3) connect if so
+ if (source != d->source.data()) {
+ if (d->source) {
+ Q_ASSERT(d->probee);
+ disconnect(d->probee.data(), SIGNAL(videoFrameProbed(QVideoFrame)), this, SIGNAL(videoFrameProbed(QVideoFrame)));
+ d->source.data()->service()->releaseControl(d->probee.data());
+ d->source.clear();
+ d->probee.clear();
+ }
+
+ if (source) {
+ QMediaService *service = source->service();
+ if (service) {
+ d->probee = service->requestControl<QMediaVideoProbeControl*>();
+ }
+
+ if (d->probee) {
+ connect(d->probee.data(), SIGNAL(videoFrameProbed(QVideoFrame)), this, SIGNAL(videoFrameProbed(QVideoFrame)));
+ d->source = source;
+ }
+ }
+ }
+
+ return (!source || d->probee != 0);
+}
+
+/*!
+ Starts monitoring the given \a mediaRecorder.
+
+ If \a source is zero, this probe will be deactivated
+ and this function wil return true.
+
+ If the media recorder instance does not support monitoring
+ video, this function will return false.
+
+ Any previously monitored objects will no longer be monitored.
+ Passing in the same object will be ignored, but
+ monitoring will continue.
+ */
+bool QVideoProbe::setSource(QMediaRecorder *mediaRecorder)
+{
+ QMediaObject *source = mediaRecorder ? mediaRecorder->mediaObject() : 0;
+ bool result = setSource(source);
+
+ if (!mediaRecorder)
+ return true;
+
+ if (mediaRecorder && !source)
+ return false;
+
+ return result;
+}
+
+/*!
+ Returns true if this probe is monitoring something, or false otherwise.
+
+ The source being monitored does not need to be active.
+ */
+bool QVideoProbe::isActive() const
+{
+ return d->probee != 0;
+}
+
+QT_END_NAMESPACE
diff --git a/src/multimedia/video/qvideoprobe.h b/src/multimedia/video/qvideoprobe.h
new file mode 100644
index 00000000..304f3fff
--- /dev/null
+++ b/src/multimedia/video/qvideoprobe.h
@@ -0,0 +1,81 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** 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, Nokia gives you certain additional
+** rights. These rights are described in the Nokia 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.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QVIDEOPROBE_H
+#define QVIDEOPROBE_H
+
+#include <QObject>
+#include <qvideoframe.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Multimedia)
+
+class QMediaObject;
+class QMediaRecorder;
+
+class QVideoProbePrivate;
+class QVideoProbe : public QObject
+{
+ Q_OBJECT
+public:
+ explicit QVideoProbe(QObject *parent = 0);
+ ~QVideoProbe();
+
+ bool setSource(QMediaObject *source);
+ bool setSource(QMediaRecorder *source);
+
+ bool isActive() const;
+
+Q_SIGNALS:
+ void videoFrameProbed(const QVideoFrame &videoFrame);
+
+private:
+ QVideoProbePrivate *d;
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif // QVIDEOPROBE_H
diff --git a/src/multimedia/video/video.pri b/src/multimedia/video/video.pri
index 01550a8e..1eaed32c 100644
--- a/src/multimedia/video/video.pri
+++ b/src/multimedia/video/video.pri
@@ -5,7 +5,8 @@ PUBLIC_HEADERS += \
video/qabstractvideobuffer.h \
video/qabstractvideosurface.h \
video/qvideoframe.h \
- video/qvideosurfaceformat.h
+ video/qvideosurfaceformat.h \
+ video/qvideoprobe.h
PRIVATE_HEADERS += \
video/qabstractvideobuffer_p.h \
@@ -20,5 +21,9 @@ SOURCES += \
video/qmemoryvideobuffer.cpp \
video/qvideoframe.cpp \
video/qvideosurfaceformat.cpp \
- video/qvideosurfaceoutput.cpp
+ video/qvideosurfaceoutput.cpp \
+ video/qvideoprobe.cpp
+
+
+