From 28c053ccaddb4d8afa8581023a9618c2679dd16c Mon Sep 17 00:00:00 2001 From: Yoann Lopes Date: Tue, 25 Sep 2012 16:58:44 +0200 Subject: [PATCH] Use QVideoWidget in the videowidget example. The videowidget example now uses QVideoWidget instead of a custom QAbstractVideoSurface, the former being the most straightforward and fastest way of showing a video in a QWidget. The old code has been moved to a new example: "customvideosurface". Change-Id: I15fb4482d0e77bafd24d4cb03316fc8f4ef13c35 Reviewed-by: Lars Knoll Reviewed-by: Jason Barron --- examples/customvideosurface/customvideosurface.pro | 23 ++++ examples/customvideosurface/main.cpp | 53 ++++++++ examples/customvideosurface/videoplayer.cpp | 143 +++++++++++++++++++++ examples/customvideosurface/videoplayer.h | 77 +++++++++++ .../videowidget.cpp | 0 .../videowidget.h | 0 .../videowidgetsurface.cpp | 0 .../videowidgetsurface.h | 0 examples/examples.pro | 3 +- examples/videowidget/main.cpp | 1 + examples/videowidget/videoplayer.cpp | 7 +- examples/videowidget/videowidget.pro | 8 +- 12 files changed, 304 insertions(+), 11 deletions(-) create mode 100644 examples/customvideosurface/customvideosurface.pro create mode 100644 examples/customvideosurface/main.cpp create mode 100644 examples/customvideosurface/videoplayer.cpp create mode 100644 examples/customvideosurface/videoplayer.h rename examples/{videowidget => customvideosurface}/videowidget.cpp (100%) rename examples/{videowidget => customvideosurface}/videowidget.h (100%) rename examples/{videowidget => customvideosurface}/videowidgetsurface.cpp (100%) rename examples/{videowidget => customvideosurface}/videowidgetsurface.h (100%) diff --git a/examples/customvideosurface/customvideosurface.pro b/examples/customvideosurface/customvideosurface.pro new file mode 100644 index 0000000..9ddb7ed --- /dev/null +++ b/examples/customvideosurface/customvideosurface.pro @@ -0,0 +1,23 @@ +TEMPLATE = app +TARGET = customvideosurface + +QT += multimedia multimediawidgets + +HEADERS = \ + videoplayer.h \ + videowidget.h \ + videowidgetsurface.h + +SOURCES = \ + main.cpp \ + videoplayer.cpp \ + videowidget.cpp \ + videowidgetsurface.cpp + +target.path = $$[QT_INSTALL_EXAMPLES]/qtmultimedia/customvideosurface +sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS *.pro +sources.path = $$[QT_INSTALL_EXAMPLES]/qtmultimedia/customvideosurface + +INSTALLS += target sources + +QT+=widgets diff --git a/examples/customvideosurface/main.cpp b/examples/customvideosurface/main.cpp new file mode 100644 index 0000000..8b7aba6 --- /dev/null +++ b/examples/customvideosurface/main.cpp @@ -0,0 +1,53 @@ +/**************************************************************************** +** +** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "videoplayer.h" + +#include + +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); + + VideoPlayer player; + player.show(); + + return app.exec(); +} diff --git a/examples/customvideosurface/videoplayer.cpp b/examples/customvideosurface/videoplayer.cpp new file mode 100644 index 0000000..639c324 --- /dev/null +++ b/examples/customvideosurface/videoplayer.cpp @@ -0,0 +1,143 @@ +/**************************************************************************** +** +** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "videoplayer.h" + +#include "videowidget.h" + +#include +#include + +VideoPlayer::VideoPlayer(QWidget *parent) + : QWidget(parent) + , mediaPlayer(0, QMediaPlayer::VideoSurface) + , playButton(0) + , positionSlider(0) +{ + VideoWidget *videoWidget = new VideoWidget; + + QAbstractButton *openButton = new QPushButton(tr("Open...")); + connect(openButton, SIGNAL(clicked()), this, SLOT(openFile())); + + playButton = new QPushButton; + playButton->setEnabled(false); + playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay)); + + connect(playButton, SIGNAL(clicked()), + this, SLOT(play())); + + positionSlider = new QSlider(Qt::Horizontal); + positionSlider->setRange(0, 0); + + connect(positionSlider, SIGNAL(sliderMoved(int)), + this, SLOT(setPosition(int))); + + QBoxLayout *controlLayout = new QHBoxLayout; + controlLayout->setMargin(0); + controlLayout->addWidget(openButton); + controlLayout->addWidget(playButton); + controlLayout->addWidget(positionSlider); + + QBoxLayout *layout = new QVBoxLayout; + layout->addWidget(videoWidget); + layout->addLayout(controlLayout); + + setLayout(layout); + + mediaPlayer.setVideoOutput(videoWidget->videoSurface()); + connect(&mediaPlayer, SIGNAL(stateChanged(QMediaPlayer::State)), + this, SLOT(mediaStateChanged(QMediaPlayer::State))); + connect(&mediaPlayer, SIGNAL(positionChanged(qint64)), this, SLOT(positionChanged(qint64))); + connect(&mediaPlayer, SIGNAL(durationChanged(qint64)), this, SLOT(durationChanged(qint64))); +} + +VideoPlayer::~VideoPlayer() +{ +} + +void VideoPlayer::openFile() +{ + QString fileName = QFileDialog::getOpenFileName(this, tr("Open Movie"),QDir::homePath()); + + if (!fileName.isEmpty()) { + mediaPlayer.setMedia(QUrl::fromLocalFile(fileName)); + + playButton->setEnabled(true); + } +} + +void VideoPlayer::play() +{ + switch(mediaPlayer.state()) { + case QMediaPlayer::PlayingState: + mediaPlayer.pause(); + break; + default: + mediaPlayer.play(); + break; + } +} + +void VideoPlayer::mediaStateChanged(QMediaPlayer::State state) +{ + switch(state) { + case QMediaPlayer::PlayingState: + playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPause)); + break; + default: + playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay)); + break; + } +} + +void VideoPlayer::positionChanged(qint64 position) +{ + positionSlider->setValue(position); +} + +void VideoPlayer::durationChanged(qint64 duration) +{ + positionSlider->setRange(0, duration); +} + +void VideoPlayer::setPosition(int position) +{ + mediaPlayer.setPosition(position); +} diff --git a/examples/customvideosurface/videoplayer.h b/examples/customvideosurface/videoplayer.h new file mode 100644 index 0000000..ddad187 --- /dev/null +++ b/examples/customvideosurface/videoplayer.h @@ -0,0 +1,77 @@ +/**************************************************************************** +** +** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef VIDEOPLAYER_H +#define VIDEOPLAYER_H + +#include + +#include +#include + +QT_BEGIN_NAMESPACE +class QAbstractButton; +class QSlider; +QT_END_NAMESPACE + +class VideoPlayer : public QWidget +{ + Q_OBJECT +public: + VideoPlayer(QWidget *parent = 0); + ~VideoPlayer(); + +public slots: + void openFile(); + void play(); + +private slots: + void mediaStateChanged(QMediaPlayer::State state); + void positionChanged(qint64 position); + void durationChanged(qint64 duration); + void setPosition(int position); + +private: + QMediaPlayer mediaPlayer; + QAbstractButton *playButton; + QSlider *positionSlider; +}; + +#endif diff --git a/examples/videowidget/videowidget.cpp b/examples/customvideosurface/videowidget.cpp similarity index 100% rename from examples/videowidget/videowidget.cpp rename to examples/customvideosurface/videowidget.cpp diff --git a/examples/videowidget/videowidget.h b/examples/customvideosurface/videowidget.h similarity index 100% rename from examples/videowidget/videowidget.h rename to examples/customvideosurface/videowidget.h diff --git a/examples/videowidget/videowidgetsurface.cpp b/examples/customvideosurface/videowidgetsurface.cpp similarity index 100% rename from examples/videowidget/videowidgetsurface.cpp rename to examples/customvideosurface/videowidgetsurface.cpp diff --git a/examples/videowidget/videowidgetsurface.h b/examples/customvideosurface/videowidgetsurface.h similarity index 100% rename from examples/videowidget/videowidgetsurface.h rename to examples/customvideosurface/videowidgetsurface.h diff --git a/examples/examples.pro b/examples/examples.pro index 65b4d3f..cf9dae1 100644 --- a/examples/examples.pro +++ b/examples/examples.pro @@ -14,7 +14,8 @@ SUBDIRS += audiodecoder audiooutput \ videographicsitem \ videowidget \ - player + player \ + customvideosurface QT += widgets } diff --git a/examples/videowidget/main.cpp b/examples/videowidget/main.cpp index 8b7aba6..b0d83d0 100644 --- a/examples/videowidget/main.cpp +++ b/examples/videowidget/main.cpp @@ -47,6 +47,7 @@ int main(int argc, char *argv[]) QApplication app(argc, argv); VideoPlayer player; + player.resize(320, 240); player.show(); return app.exec(); diff --git a/examples/videowidget/videoplayer.cpp b/examples/videowidget/videoplayer.cpp index 639c324..d961a63 100644 --- a/examples/videowidget/videoplayer.cpp +++ b/examples/videowidget/videoplayer.cpp @@ -40,9 +40,8 @@ #include "videoplayer.h" -#include "videowidget.h" - #include +#include #include VideoPlayer::VideoPlayer(QWidget *parent) @@ -51,7 +50,7 @@ VideoPlayer::VideoPlayer(QWidget *parent) , playButton(0) , positionSlider(0) { - VideoWidget *videoWidget = new VideoWidget; + QVideoWidget *videoWidget = new QVideoWidget; QAbstractButton *openButton = new QPushButton(tr("Open...")); connect(openButton, SIGNAL(clicked()), this, SLOT(openFile())); @@ -81,7 +80,7 @@ VideoPlayer::VideoPlayer(QWidget *parent) setLayout(layout); - mediaPlayer.setVideoOutput(videoWidget->videoSurface()); + mediaPlayer.setVideoOutput(videoWidget); connect(&mediaPlayer, SIGNAL(stateChanged(QMediaPlayer::State)), this, SLOT(mediaStateChanged(QMediaPlayer::State))); connect(&mediaPlayer, SIGNAL(positionChanged(qint64)), this, SLOT(positionChanged(qint64))); diff --git a/examples/videowidget/videowidget.pro b/examples/videowidget/videowidget.pro index 76e5f36..914f48e 100644 --- a/examples/videowidget/videowidget.pro +++ b/examples/videowidget/videowidget.pro @@ -4,15 +4,11 @@ TARGET = videowidget QT += multimedia multimediawidgets HEADERS = \ - videoplayer.h \ - videowidget.h \ - videowidgetsurface.h + videoplayer.h SOURCES = \ main.cpp \ - videoplayer.cpp \ - videowidget.cpp \ - videowidgetsurface.cpp + videoplayer.cpp target.path = $$[QT_INSTALL_EXAMPLES]/qtmultimedia/videowidget sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS *.pro -- 2.7.4