Add a GStreamer element that provides a video sink that draws directly on QWidget.
[qtgstreamer:qtgstreamer.git] / tests / manual / qwidgetvideosinktest.cpp
1 /*
2     Copyright (C) 2010 George Kiagiadakis <kiagiadakis.george@gmail.com>
3
4     This library is free software; you can redistribute it and/or modify
5     it under the terms of the GNU Lesser General Public License as published
6     by the Free Software Foundation; either version 2.1 of the License, or
7     (at your option) any later version.
8
9     This program is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12     GNU General Public License for more details.
13
14     You should have received a copy of the GNU Lesser General Public License
15     along with this program.  If not, see <http://www.gnu.org/licenses/>.
16 */
17 #include "ui_qwidgetvideosinktest.h"
18 #include <QGst/Pipeline>
19 #include <QGst/ElementFactory>
20 #include <QtGui/QApplication>
21 #include <QtGui/QWidget>
22
23 class QWidgetVideoSinkTest : public QWidget
24 {
25     Q_OBJECT
26 public:
27     QWidgetVideoSinkTest(QWidget *parent = 0, Qt::WindowFlags f = 0);
28
29 private Q_SLOTS:
30     void on_leftRadioButton_toggled(bool on);
31     void onButtonClicked(int id);
32
33 private:
34     Ui::QWidgetVideoSinkTest m_ui;
35     QGst::PipelinePtr m_pipeline;
36     QGst::ElementPtr m_sink;
37 };
38
39 QWidgetVideoSinkTest::QWidgetVideoSinkTest(QWidget *parent, Qt::WindowFlags f)
40     : QWidget(parent, f)
41 {
42     m_ui.setupUi(this);
43
44     QButtonGroup *group = new QButtonGroup(this);
45     group->addButton(m_ui.playingButton, QGst::StatePlaying);
46     group->addButton(m_ui.pausedButton, QGst::StatePaused);
47     group->addButton(m_ui.readyButton, QGst::StateReady);
48     group->addButton(m_ui.nullButton, QGst::StateNull);
49     connect(group, SIGNAL(buttonClicked(int)), SLOT(onButtonClicked(int)));
50
51     m_pipeline = QGst::Pipeline::create();
52     QGst::ElementPtr src = QGst::ElementFactory::make("videotestsrc");
53     m_sink = QGst::ElementFactory::make("qwidgetvideosink");
54
55     if (!src || !m_sink) {
56         throw std::runtime_error("Unable to initialize the required elements");
57     }
58
59     m_pipeline->add(src);
60     m_pipeline->add(m_sink);
61     src->link(m_sink);
62
63     //GValue of G_TYPE_POINTER can only be set as void* in the bindings
64     m_sink->setProperty<void*>("widget", m_ui.leftWidget);
65 }
66
67 void QWidgetVideoSinkTest::on_leftRadioButton_toggled(bool on)
68 {
69     m_sink->setProperty<void*>("widget", on ? m_ui.leftWidget : m_ui.rightWidget);
70 }
71
72 void QWidgetVideoSinkTest::onButtonClicked(int id)
73 {
74     QGst::State state = static_cast<QGst::State>(id);
75     m_pipeline->setState(state);
76 }
77
78 int main(int argc, char **argv)
79 {
80     QApplication app(argc, argv);
81     QGst::init(&argc, &argv);
82
83     QWidgetVideoSinkTest test;
84     test.show();
85
86     return app.exec();
87 }
88
89 #include "qwidgetvideosinktest.moc"