Changed QVideoSurfaceGstSink to take pools from plugins
authorJonas Rabbe <jonas.rabbe@nokia.com>
Tue, 8 Nov 2011 02:38:02 +0000 (12:38 +1000)
committerQt by Nokia <qt-info@nokia.com>
Mon, 14 Nov 2011 06:59:19 +0000 (07:59 +0100)
Change-Id: Iec743efc52513e2000276b9a18d1d9639c270699
Reviewed-by: Dmytro Poplavskiy <dmytro.poplavskiy@nokia.com>
src/gsttools/gsttools.pro
src/gsttools/qgstbufferpoolinterface.cpp [new file with mode: 0644]
src/gsttools/qvideosurfacegstsink.cpp
src/multimedia/gsttools_headers/qabstractgstbufferpool_p.h [deleted file]
src/multimedia/gsttools_headers/qgstbufferpoolinterface_p.h [new file with mode: 0644]
src/multimedia/gsttools_headers/qgstxvimagebuffer_p.h
src/multimedia/gsttools_headers/qvideosurfacegstsink_p.h

index c8beed80236e2400f68b1f72d25d5fca65795045..c972058baa057712de64cec0a1876c03a16d937c 100644 (file)
@@ -2,7 +2,7 @@ TEMPLATE = lib
 
 TARGET = qgsttools_p
 QPRO_PWD = $$PWD
-QT = core multimedia
+QT = core multimedia-private
 
 !static:DEFINES += QT_MAKEDLL
 
@@ -36,14 +36,16 @@ INCLUDEPATH += ../multimedia/gsttools_headers/
 DEPENDPATH += ../multimedia/gsttools_headers/
 
 PRIVATE_HEADERS += \
-    qabstractgstbufferpool_p.h \
+    qgstbufferpoolinterface_p.h \
     qgstreamerbushelper_p.h \
     qgstreamermessage_p.h \
     qgstutils_p.h \
     qgstvideobuffer_p.h \
     qvideosurfacegstsink_p.h \
 
+
 SOURCES += \
+    qgstbufferpoolinterface.cpp \
     qgstreamerbushelper.cpp \
     qgstreamermessage.cpp \
     qgstutils.cpp \
diff --git a/src/gsttools/qgstbufferpoolinterface.cpp b/src/gsttools/qgstbufferpoolinterface.cpp
new file mode 100644 (file)
index 0000000..01e8873
--- /dev/null
@@ -0,0 +1,54 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** 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 "qgstbufferpoolinterface_p.h"
+
+QT_BEGIN_NAMESPACE
+
+QGstBufferPoolPlugin::QGstBufferPoolPlugin(QObject *parent) :
+    QObject(parent)
+{
+}
+
+#include "moc_qgstbufferpoolinterface_p.cpp"
+
+QT_END_NAMESPACE
+
index d4bb208372f4e3ef64afafcf7e7c97df93e3bb07..545c37ead436e276498e4f8eee92ebbb1ae887a3 100644 (file)
@@ -46,6 +46,7 @@
 #include <QDebug>
 #include <QThread>
 
+#include <private/qmediapluginloader_p.h>
 #include "qgstvideobuffer_p.h"
 
 #if defined(Q_WS_X11) && !defined(QT_NO_XVIDEO)
 
 //#define DEBUG_VIDEO_SURFACE_SINK
 
+Q_GLOBAL_STATIC_WITH_ARGS(QMediaPluginLoader, bufferPoolLoader,
+        (QGstBufferPoolInterface_iid, QLatin1String("video"), Qt::CaseInsensitive))
+
+
 QVideoSurfaceGstDelegate::QVideoSurfaceGstDelegate(
     QAbstractVideoSurface *surface)
     : m_surface(surface)
@@ -66,6 +71,12 @@ QVideoSurfaceGstDelegate::QVideoSurfaceGstDelegate(
     , m_startCanceled(false)
 {
     if (m_surface) {
+        foreach (QObject *instance, bufferPoolLoader()->instances(QGstBufferPoolPluginKey)) {
+            QGstBufferPoolInterface* plugin = qobject_cast<QGstBufferPoolInterface*>(instance);
+            if (plugin) {
+                m_pools.append(plugin);
+            }
+        }
 #if defined(Q_WS_X11) && !defined(QT_NO_XVIDEO)
         m_pools.append(new QGstXvImageBufferPool());
 #endif
@@ -258,8 +269,8 @@ void QVideoSurfaceGstDelegate::queuedRender()
 
 void QVideoSurfaceGstDelegate::updateSupportedFormats()
 {
-    QAbstractGstBufferPool *newPool = 0;
-    foreach (QAbstractGstBufferPool *pool, m_pools) {
+    QGstBufferPoolInterface *newPool = 0;
+    foreach (QGstBufferPoolInterface *pool, m_pools) {
         if (!m_surface->supportedPixelFormats(pool->handleType()).isEmpty()) {
             newPool = pool;
             break;
@@ -669,7 +680,7 @@ GstFlowReturn QVideoSurfaceGstSink::buffer_alloc(
         return GST_FLOW_OK;
 
     QMutexLocker poolLock(sink->delegate->poolMutex());
-    QAbstractGstBufferPool *pool = sink->delegate->pool();
+    QGstBufferPoolInterface *pool = sink->delegate->pool();
 
     if (!pool)
         return GST_FLOW_OK;
diff --git a/src/multimedia/gsttools_headers/qabstractgstbufferpool_p.h b/src/multimedia/gsttools_headers/qabstractgstbufferpool_p.h
deleted file mode 100644 (file)
index 40c75ad..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** 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 QGSTBUFFERPOOL_P_H
-#define QGSTBUFFERPOOL_P_H
-
-//
-//  W A R N I N G
-//  -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <qabstractvideobuffer.h>
-#include <qvideosurfaceformat.h>
-
-#include <gst/gst.h>
-
-/*!
-    Abstract interface for video buffers allocation.
-*/
-class QAbstractGstBufferPool
-{
-public:
-    virtual ~QAbstractGstBufferPool() {}
-
-    virtual bool isFormatSupported(const QVideoSurfaceFormat &format) const = 0;
-
-    virtual GType bufferType() const = 0;
-    virtual GstBuffer *takeBuffer(const QVideoSurfaceFormat &format, GstCaps *caps) = 0;
-    virtual void clear() = 0;
-
-    virtual QAbstractVideoBuffer::HandleType handleType() const = 0;
-
-    /*!
-      Build an QAbstractVideoBuffer instance from compatible (mathcing gst buffer type)
-      GstBuffer.
-
-      This method is called from gstreamer video sink thread.
-     */
-    virtual QAbstractVideoBuffer *prepareVideoBuffer(GstBuffer *buffer, int bytesPerLine) = 0;
-};
-
-#endif
diff --git a/src/multimedia/gsttools_headers/qgstbufferpoolinterface_p.h b/src/multimedia/gsttools_headers/qgstbufferpoolinterface_p.h
new file mode 100644 (file)
index 0000000..7dbccfd
--- /dev/null
@@ -0,0 +1,121 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** 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 QGSTBUFFERPOOLINTERFACE_P_H
+#define QGSTBUFFERPOOLINTERFACE_P_H
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <qabstractvideobuffer.h>
+#include <qvideosurfaceformat.h>
+#include <QtCore/qobject.h>
+#include <QtCore/qplugin.h>
+#include <QtCore/qfactoryinterface.h>
+
+#include <gst/gst.h>
+
+const QLatin1String QGstBufferPoolPluginKey("bufferpool");
+
+/*!
+    Abstract interface for video buffers allocation.
+*/
+class QGstBufferPoolInterface : public QFactoryInterface
+{
+public:
+    virtual ~QGstBufferPoolInterface() {}
+
+    virtual bool isFormatSupported(const QVideoSurfaceFormat &format) const = 0;
+
+    virtual GType bufferType() const = 0;
+    virtual GstBuffer *takeBuffer(const QVideoSurfaceFormat &format, GstCaps *caps) = 0;
+    virtual void clear() = 0;
+
+    virtual QAbstractVideoBuffer::HandleType handleType() const = 0;
+
+    /*!
+      Build an QAbstractVideoBuffer instance from compatible (mathcing gst buffer type)
+      GstBuffer.
+
+      This method is called from gstreamer video sink thread.
+     */
+    virtual QAbstractVideoBuffer *prepareVideoBuffer(GstBuffer *buffer, int bytesPerLine) = 0;
+};
+
+#define QGstBufferPoolInterface_iid "com.nokia.Qt.QGstBufferPoolInterface"
+Q_DECLARE_INTERFACE(QGstBufferPoolInterface, QGstBufferPoolInterface_iid)
+
+class QGstBufferPoolPlugin : public QObject, public QGstBufferPoolInterface
+{
+    Q_OBJECT
+    Q_INTERFACES(QGstBufferPoolInterface:QFactoryInterface)
+public:
+    explicit QGstBufferPoolPlugin(QObject *parent = 0);
+    virtual ~QGstBufferPoolPlugin() {}
+
+    virtual bool isFormatSupported(const QVideoSurfaceFormat &format) const = 0;
+
+    virtual GType bufferType() const = 0;
+    virtual GstBuffer *takeBuffer(const QVideoSurfaceFormat &format, GstCaps *caps) = 0;
+    virtual void clear() = 0;
+
+    virtual QAbstractVideoBuffer::HandleType handleType() const = 0;
+
+    /*!
+      Build an QAbstractVideoBuffer instance from compatible (mathcing gst buffer type)
+      GstBuffer.
+
+      This method is called from gstreamer video sink thread.
+     */
+    virtual QAbstractVideoBuffer *prepareVideoBuffer(GstBuffer *buffer, int bytesPerLine) = 0;
+
+    virtual QStringList keys() const = 0;
+};
+
+#endif
index c6f74373e229405c0f2c95a1a5dd6e473c5b7e41..6fd7eb769ffc10ac9f76d9902cfe2d0fa6c436b8 100644 (file)
@@ -71,7 +71,7 @@
 
 
 #include <gst/gst.h>
-#include "qabstractgstbufferpool_p.h"
+#include "qgstbufferpoolinterface_p.h"
 
 class QGstXvImageBufferPool;
 
@@ -91,7 +91,7 @@ struct QGstXvImageBuffer {
 
 Q_DECLARE_METATYPE(XvImage*)
 
-class QGstXvImageBufferPool : public QObject, public QAbstractGstBufferPool {
+class QGstXvImageBufferPool : public QObject, public QGstBufferPoolInterface {
 Q_OBJECT
 friend class QGstXvImageBuffer;
 public:
index 438b796cf47fdd642038dc952a4fa4c25a09d79f..55147ef38e9be1ed26bc3e0cea06909c545a7741 100644 (file)
@@ -64,7 +64,7 @@
 #include <qvideoframe.h>
 #include <qabstractvideobuffer.h>
 
-#include "qabstractgstbufferpool_p.h"
+#include "qgstbufferpoolinterface_p.h"
 
 QT_BEGIN_NAMESPACE
 class QAbstractVideoSurface;
@@ -92,7 +92,7 @@ public:
 
     bool isActive();
 
-    QAbstractGstBufferPool *pool() { return m_pool; }
+    QGstBufferPoolInterface *pool() { return m_pool; }
     QMutex *poolMutex() { return &m_poolMutex; }
 
     GstFlowReturn render(GstBuffer *buffer);
@@ -109,8 +109,8 @@ private:
     QList<QVideoFrame::PixelFormat> m_supportedPixelFormats;
     //pixel formats of buffers pool native type
     QList<QVideoFrame::PixelFormat> m_supportedPoolPixelFormats;
-    QAbstractGstBufferPool *m_pool;
-    QList<QAbstractGstBufferPool *> m_pools;
+    QGstBufferPoolInterface *m_pool;
+    QList<QGstBufferPoolInterface *> m_pools;
     QMutex m_poolMutex;
     QMutex m_mutex;
     QWaitCondition m_setupCondition;