Add some media probing API.
authorMichael Goddard <michael.goddard@nokia.com>
Fri, 27 Jan 2012 05:02:31 +0000 (15:02 +1000)
committerQt by Nokia <qt-info@nokia.com>
Tue, 7 Feb 2012 04:01:24 +0000 (05:01 +0100)
Change-Id: Ib83918f99b699ac3fbc7ede82a392d00d4c18005
Reviewed-by: Jonas Rabbe <jonas.rabbe@nokia.com>
src/multimedia/audio/audio.pri
src/multimedia/audio/qaudioprobe.cpp [new file with mode: 0644]
src/multimedia/audio/qaudioprobe.h [new file with mode: 0644]
src/multimedia/controls/controls.pri
src/multimedia/controls/qmediaaudioprobecontrol.cpp [new file with mode: 0644]
src/multimedia/controls/qmediaaudioprobecontrol.h [new file with mode: 0644]
src/multimedia/controls/qmediavideoprobecontrol.cpp [new file with mode: 0644]
src/multimedia/controls/qmediavideoprobecontrol.h [new file with mode: 0644]
src/multimedia/video/qvideoprobe.cpp [new file with mode: 0644]
src/multimedia/video/qvideoprobe.h [new file with mode: 0644]
src/multimedia/video/video.pri

index a1cfa0b..33fd5a8 100644 (file)
@@ -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 (file)
index 0000000..e51c56a
--- /dev/null
@@ -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 (file)
index 0000000..1b201ac
--- /dev/null
@@ -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
index 25d94c1..87ce6b3 100644 (file)
@@ -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 (file)
index 0000000..dc32cba
--- /dev/null
@@ -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 (file)
index 0000000..c2198d1
--- /dev/null
@@ -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 (file)
index 0000000..f42e17a
--- /dev/null
@@ -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 (file)
index 0000000..b1575a5
--- /dev/null
@@ -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 (file)
index 0000000..d9d0d65
--- /dev/null
@@ -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 (file)
index 0000000..304f3ff
--- /dev/null
@@ -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
index 01550a8..1eaed32 100644 (file)
@@ -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
+
+
+