diff options
-rw-r--r-- | src/gsttools/gsttools.pro | 6 | ||||
-rw-r--r-- | src/gsttools/qgstbufferpoolinterface.cpp | 54 | ||||
-rw-r--r-- | src/gsttools/qvideosurfacegstsink.cpp | 17 | ||||
-rw-r--r-- | src/multimedia/gsttools_headers/qgstbufferpoolinterface_p.h (renamed from src/multimedia/gsttools_headers/qabstractgstbufferpool_p.h) | 45 | ||||
-rw-r--r-- | src/multimedia/gsttools_headers/qgstxvimagebuffer_p.h | 4 | ||||
-rw-r--r-- | src/multimedia/gsttools_headers/qvideosurfacegstsink_p.h | 8 |
6 files changed, 118 insertions, 16 deletions
diff --git a/src/gsttools/gsttools.pro b/src/gsttools/gsttools.pro index c8beed802..c972058ba 100644 --- a/src/gsttools/gsttools.pro +++ b/src/gsttools/gsttools.pro @@ -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 index 000000000..01e88734a --- /dev/null +++ b/src/gsttools/qgstbufferpoolinterface.cpp @@ -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 + diff --git a/src/gsttools/qvideosurfacegstsink.cpp b/src/gsttools/qvideosurfacegstsink.cpp index d4bb20837..545c37ead 100644 --- a/src/gsttools/qvideosurfacegstsink.cpp +++ b/src/gsttools/qvideosurfacegstsink.cpp @@ -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) @@ -57,6 +58,10 @@ //#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/qgstbufferpoolinterface_p.h index 40c75ad32..7dbccfdbc 100644 --- a/src/multimedia/gsttools_headers/qabstractgstbufferpool_p.h +++ b/src/multimedia/gsttools_headers/qgstbufferpoolinterface_p.h @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** @@ -39,8 +39,8 @@ ** ****************************************************************************/ -#ifndef QGSTBUFFERPOOL_P_H -#define QGSTBUFFERPOOL_P_H +#ifndef QGSTBUFFERPOOLINTERFACE_P_H +#define QGSTBUFFERPOOLINTERFACE_P_H // // W A R N I N G @@ -55,16 +55,21 @@ #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 QAbstractGstBufferPool +class QGstBufferPoolInterface : public QFactoryInterface { public: - virtual ~QAbstractGstBufferPool() {} + virtual ~QGstBufferPoolInterface() {} virtual bool isFormatSupported(const QVideoSurfaceFormat &format) const = 0; @@ -83,4 +88,34 @@ public: 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 diff --git a/src/multimedia/gsttools_headers/qgstxvimagebuffer_p.h b/src/multimedia/gsttools_headers/qgstxvimagebuffer_p.h index c6f74373e..6fd7eb769 100644 --- a/src/multimedia/gsttools_headers/qgstxvimagebuffer_p.h +++ b/src/multimedia/gsttools_headers/qgstxvimagebuffer_p.h @@ -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: diff --git a/src/multimedia/gsttools_headers/qvideosurfacegstsink_p.h b/src/multimedia/gsttools_headers/qvideosurfacegstsink_p.h index 438b796cf..55147ef38 100644 --- a/src/multimedia/gsttools_headers/qvideosurfacegstsink_p.h +++ b/src/multimedia/gsttools_headers/qvideosurfacegstsink_p.h @@ -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; |