summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorge Kiagiadakis <george.kiagiadakis@collabora.com>2011-11-01 14:48:40 +0200
committerGeorge Kiagiadakis <george.kiagiadakis@collabora.com>2012-02-07 21:28:56 +0200
commit5922d3965c4b0b4b8a97b79b6e3a2cd39fb0ac60 (patch)
tree46c93ef82f9429f22d0797191368af125f51df8d
parent9bce0cf9e5fab59eb780c3bdbc9256fea3f31efb (diff)
VideoWidget: Add support for qtvideosink
-rw-r--r--src/QGst/Ui/videowidget.cpp49
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);
}