diff options
author | George Kiagiadakis <george.kiagiadakis@collabora.com> | 2011-11-01 14:48:40 +0200 |
---|---|---|
committer | George Kiagiadakis <george.kiagiadakis@collabora.com> | 2012-02-07 21:28:56 +0200 |
commit | 5922d3965c4b0b4b8a97b79b6e3a2cd39fb0ac60 (patch) | |
tree | 46c93ef82f9429f22d0797191368af125f51df8d | |
parent | 9bce0cf9e5fab59eb780c3bdbc9256fea3f31efb (diff) |
VideoWidget: Add support for qtvideosink
-rw-r--r-- | src/QGst/Ui/videowidget.cpp | 49 |
1 files changed, 48 insertions, 1 deletions
diff --git a/src/QGst/Ui/videowidget.cpp b/src/QGst/Ui/videowidget.cpp index c4edabd..faf3790 100644 --- a/src/QGst/Ui/videowidget.cpp +++ b/src/QGst/Ui/videowidget.cpp @@ -1,6 +1,6 @@ /* Copyright (C) 2010 George Kiagiadakis <kiagiadakis.george@gmail.com> - Copyright (C) 2011 Collabora Ltd. + Copyright (C) 2011-2012 Collabora Ltd. @author George Kiagiadakis <george.kiagiadakis@collabora.co.uk> This library is free software; you can redistribute it and/or modify @@ -22,6 +22,7 @@ #include "../bus.h" #include "../message.h" #include "../../QGlib/connect.h" +#include "../../QGlib/signal.h" #include <QtCore/QDebug> #include <QtCore/QMutex> #include <QtCore/QThread> @@ -114,6 +115,48 @@ private: }; +class QtVideoSinkRenderer : public QObject, public AbstractRenderer +{ +public: + QtVideoSinkRenderer(const ElementPtr & sink, QWidget *parent) + : QObject(parent), m_sink(sink) + { + QGlib::connect(sink, "update", this, &QtVideoSinkRenderer::onUpdate); + parent->installEventFilter(this); + parent->setAttribute(Qt::WA_OpaquePaintEvent, true); + } + + virtual ~QtVideoSinkRenderer() + { + widget()->removeEventFilter(this); + widget()->setAttribute(Qt::WA_OpaquePaintEvent, false); + } + + virtual ElementPtr videoSink() const { return m_sink; } + +protected: + virtual bool eventFilter(QObject *filteredObject, QEvent *event) + { + if (filteredObject == parent() && event->type() == QEvent::Paint) { + QPainter painter(widget()); + QRect targetArea = widget()->rect(); + QGlib::emit<void>(m_sink, "paint", (void*) &painter, + (qreal) targetArea.x(), (qreal) targetArea.y(), + (qreal) targetArea.width(), (qreal) targetArea.height()); + return true; + } else { + return QObject::eventFilter(filteredObject, event); + } + } + +private: + inline QWidget *widget() { return static_cast<QWidget*>(parent()); } + void onUpdate() { widget()->update(); } + + ElementPtr m_sink; +}; + + class QWidgetVideoSinkRenderer : public AbstractRenderer { public: @@ -194,6 +237,10 @@ AbstractRenderer *AbstractRenderer::create(const ElementPtr & sink, QWidget *vid return r; } + if (QGlib::Type::fromInstance(sink).name() == QLatin1String("GstQtVideoSink")) { + return new QtVideoSinkRenderer(sink, videoWidget); + } + if (QGlib::Type::fromInstance(sink).name() == QLatin1String("GstQWidgetVideoSink")) { return new QWidgetVideoSinkRenderer(sink, videoWidget); } |