From b616dd5165a2f1e554eda1f85acf6c6000ba24b9 Mon Sep 17 00:00:00 2001 From: Yoann Lopes Date: Mon, 1 Oct 2012 17:50:55 +0200 Subject: [PATCH] Use QVideoGraphicsItem in the videographicsitem example. The videographicsitem example now uses QVideoGraphicsItem instead of a custom QAbstractVideoSurface. The old code has been moved to a new example: "customvideosurface/customvideoitem". Change-Id: I83212f36168ef94d670b447eb1a742a39753939d Reviewed-by: Jason Barron --- .../customvideoitem/customvideoitem.pro | 21 +++ .../customvideosurface/customvideoitem/main.cpp | 54 +++++++ .../customvideoitem}/videoitem.cpp | 0 .../customvideoitem}/videoitem.h | 0 .../customvideoitem/videoplayer.cpp | 174 +++++++++++++++++++++ .../customvideoitem/videoplayer.h | 85 ++++++++++ examples/customvideosurface/customvideosurface.pro | 24 +-- .../customvideowidget/customvideowidget.pro | 23 +++ .../{ => customvideowidget}/main.cpp | 0 .../{ => customvideowidget}/videoplayer.cpp | 0 .../{ => customvideowidget}/videoplayer.h | 0 .../{ => customvideowidget}/videowidget.cpp | 0 .../{ => customvideowidget}/videowidget.h | 0 .../{ => customvideowidget}/videowidgetsurface.cpp | 0 .../{ => customvideowidget}/videowidgetsurface.h | 0 examples/videographicsitem/videographicsitem.pro | 6 +- examples/videographicsitem/videoplayer.cpp | 5 +- examples/videographicsitem/videoplayer.h | 6 +- 18 files changed, 366 insertions(+), 32 deletions(-) create mode 100644 examples/customvideosurface/customvideoitem/customvideoitem.pro create mode 100644 examples/customvideosurface/customvideoitem/main.cpp rename examples/{videographicsitem => customvideosurface/customvideoitem}/videoitem.cpp (100%) rename examples/{videographicsitem => customvideosurface/customvideoitem}/videoitem.h (100%) create mode 100644 examples/customvideosurface/customvideoitem/videoplayer.cpp create mode 100644 examples/customvideosurface/customvideoitem/videoplayer.h create mode 100644 examples/customvideosurface/customvideowidget/customvideowidget.pro rename examples/customvideosurface/{ => customvideowidget}/main.cpp (100%) rename examples/customvideosurface/{ => customvideowidget}/videoplayer.cpp (100%) rename examples/customvideosurface/{ => customvideowidget}/videoplayer.h (100%) rename examples/customvideosurface/{ => customvideowidget}/videowidget.cpp (100%) rename examples/customvideosurface/{ => customvideowidget}/videowidget.h (100%) rename examples/customvideosurface/{ => customvideowidget}/videowidgetsurface.cpp (100%) rename examples/customvideosurface/{ => customvideowidget}/videowidgetsurface.h (100%) diff --git a/examples/customvideosurface/customvideoitem/customvideoitem.pro b/examples/customvideosurface/customvideoitem/customvideoitem.pro new file mode 100644 index 0000000..a2a7a1e --- /dev/null +++ b/examples/customvideosurface/customvideoitem/customvideoitem.pro @@ -0,0 +1,21 @@ +TEMPLATE = app +TARGET = customvideoitem + +QT += multimedia multimediawidgets + +contains(QT_CONFIG, opengl): QT += opengl + +HEADERS += videoplayer.h \ + videoitem.h + +SOURCES += main.cpp \ + videoplayer.cpp \ + videoitem.cpp + +target.path = $$[QT_INSTALL_EXAMPLES]/qtmultimedia/customvideoitem +sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS *.pro +sources.path = $$[QT_INSTALL_EXAMPLES]/qtmultimedia/customvideoitem + +INSTALLS += target sources + +QT+=widgets diff --git a/examples/customvideosurface/customvideoitem/main.cpp b/examples/customvideosurface/customvideoitem/main.cpp new file mode 100644 index 0000000..d1899c7 --- /dev/null +++ b/examples/customvideosurface/customvideoitem/main.cpp @@ -0,0 +1,54 @@ +/**************************************************************************** +** +** 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/videographicsitem/videoitem.cpp b/examples/customvideosurface/customvideoitem/videoitem.cpp similarity index 100% rename from examples/videographicsitem/videoitem.cpp rename to examples/customvideosurface/customvideoitem/videoitem.cpp diff --git a/examples/videographicsitem/videoitem.h b/examples/customvideosurface/customvideoitem/videoitem.h similarity index 100% rename from examples/videographicsitem/videoitem.h rename to examples/customvideosurface/customvideoitem/videoitem.h diff --git a/examples/customvideosurface/customvideoitem/videoplayer.cpp b/examples/customvideosurface/customvideoitem/videoplayer.cpp new file mode 100644 index 0000000..da4aa88 --- /dev/null +++ b/examples/customvideosurface/customvideoitem/videoplayer.cpp @@ -0,0 +1,174 @@ +/**************************************************************************** +** +** 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 "videoitem.h" + +#include +#include + +#if !defined(QT_NO_OPENGL) +# include +#endif + +VideoPlayer::VideoPlayer(QWidget *parent, Qt::WindowFlags flags) + : QWidget(parent, flags) + , mediaPlayer(0, QMediaPlayer::VideoSurface) + , videoItem(0) + , playButton(0) + , positionSlider(0) +{ + videoItem = new VideoItem; + + QGraphicsScene *scene = new QGraphicsScene(this); + QGraphicsView *graphicsView = new QGraphicsView(scene); + +#if !defined(QT_NO_OPENGL) + graphicsView->setViewport(new QGLWidget); +#endif + + scene->addItem(videoItem); + + QSlider *rotateSlider = new QSlider(Qt::Horizontal); + rotateSlider->setRange(-180, 180); + rotateSlider->setValue(0); + + connect(rotateSlider, SIGNAL(valueChanged(int)), + this, SLOT(rotateVideo(int))); + + 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(graphicsView); + layout->addWidget(rotateSlider); + layout->addLayout(controlLayout); + + setLayout(layout); + + mediaPlayer.setVideoOutput(videoItem); + 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); +} + + +void VideoPlayer::rotateVideo(int angle) +{ + //rotate around the center of video element + qreal x = videoItem->boundingRect().width() / 2.0; + qreal y = videoItem->boundingRect().height() / 2.0; + videoItem->setTransform(QTransform().translate(x, y).rotate(angle).translate(-x, -y)); +} diff --git a/examples/customvideosurface/customvideoitem/videoplayer.h b/examples/customvideosurface/customvideoitem/videoplayer.h new file mode 100644 index 0000000..2fcbe09 --- /dev/null +++ b/examples/customvideosurface/customvideoitem/videoplayer.h @@ -0,0 +1,85 @@ +/**************************************************************************** +** +** 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 VideoItem; + +class VideoPlayer : public QWidget +{ + Q_OBJECT +public: + VideoPlayer(QWidget *parent = 0, Qt::WindowFlags flags = 0); + ~VideoPlayer(); + + QSize sizeHint() const { return QSize(800, 600); } + +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); + void rotateVideo(int angle); + +private: + QMediaPlayer mediaPlayer; + VideoItem *videoItem; + QAbstractButton *playButton; + QSlider *positionSlider; +}; + +#endif + diff --git a/examples/customvideosurface/customvideosurface.pro b/examples/customvideosurface/customvideosurface.pro index 9ddb7ed..1230f2c 100644 --- a/examples/customvideosurface/customvideosurface.pro +++ b/examples/customvideosurface/customvideosurface.pro @@ -1,23 +1,3 @@ -TEMPLATE = app -TARGET = customvideosurface +TEMPLATE = subdirs -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 +SUBDIRS += customvideoitem customvideowidget diff --git a/examples/customvideosurface/customvideowidget/customvideowidget.pro b/examples/customvideosurface/customvideowidget/customvideowidget.pro new file mode 100644 index 0000000..c3ac2cd --- /dev/null +++ b/examples/customvideosurface/customvideowidget/customvideowidget.pro @@ -0,0 +1,23 @@ +TEMPLATE = app +TARGET = customvideowidget + +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/customvideowidget +sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS *.pro +sources.path = $$[QT_INSTALL_EXAMPLES]/qtmultimedia/customvideowidget + +INSTALLS += target sources + +QT+=widgets diff --git a/examples/customvideosurface/main.cpp b/examples/customvideosurface/customvideowidget/main.cpp similarity index 100% rename from examples/customvideosurface/main.cpp rename to examples/customvideosurface/customvideowidget/main.cpp diff --git a/examples/customvideosurface/videoplayer.cpp b/examples/customvideosurface/customvideowidget/videoplayer.cpp similarity index 100% rename from examples/customvideosurface/videoplayer.cpp rename to examples/customvideosurface/customvideowidget/videoplayer.cpp diff --git a/examples/customvideosurface/videoplayer.h b/examples/customvideosurface/customvideowidget/videoplayer.h similarity index 100% rename from examples/customvideosurface/videoplayer.h rename to examples/customvideosurface/customvideowidget/videoplayer.h diff --git a/examples/customvideosurface/videowidget.cpp b/examples/customvideosurface/customvideowidget/videowidget.cpp similarity index 100% rename from examples/customvideosurface/videowidget.cpp rename to examples/customvideosurface/customvideowidget/videowidget.cpp diff --git a/examples/customvideosurface/videowidget.h b/examples/customvideosurface/customvideowidget/videowidget.h similarity index 100% rename from examples/customvideosurface/videowidget.h rename to examples/customvideosurface/customvideowidget/videowidget.h diff --git a/examples/customvideosurface/videowidgetsurface.cpp b/examples/customvideosurface/customvideowidget/videowidgetsurface.cpp similarity index 100% rename from examples/customvideosurface/videowidgetsurface.cpp rename to examples/customvideosurface/customvideowidget/videowidgetsurface.cpp diff --git a/examples/customvideosurface/videowidgetsurface.h b/examples/customvideosurface/customvideowidget/videowidgetsurface.h similarity index 100% rename from examples/customvideosurface/videowidgetsurface.h rename to examples/customvideosurface/customvideowidget/videowidgetsurface.h diff --git a/examples/videographicsitem/videographicsitem.pro b/examples/videographicsitem/videographicsitem.pro index 66ed4f6..a0a3cdc 100644 --- a/examples/videographicsitem/videographicsitem.pro +++ b/examples/videographicsitem/videographicsitem.pro @@ -5,12 +5,10 @@ QT += multimedia multimediawidgets contains(QT_CONFIG, opengl): QT += opengl -HEADERS += videoplayer.h \ - videoitem.h +HEADERS += videoplayer.h SOURCES += main.cpp \ - videoplayer.cpp \ - videoitem.cpp + videoplayer.cpp target.path = $$[QT_INSTALL_EXAMPLES]/qtmultimedia/videographicsitem sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS *.pro diff --git a/examples/videographicsitem/videoplayer.cpp b/examples/videographicsitem/videoplayer.cpp index da4aa88..4cf1c08 100644 --- a/examples/videographicsitem/videoplayer.cpp +++ b/examples/videographicsitem/videoplayer.cpp @@ -39,10 +39,10 @@ ****************************************************************************/ #include "videoplayer.h" -#include "videoitem.h" #include #include +#include #if !defined(QT_NO_OPENGL) # include @@ -55,7 +55,8 @@ VideoPlayer::VideoPlayer(QWidget *parent, Qt::WindowFlags flags) , playButton(0) , positionSlider(0) { - videoItem = new VideoItem; + videoItem = new QGraphicsVideoItem; + videoItem->setSize(QSizeF(640, 480)); QGraphicsScene *scene = new QGraphicsScene(this); QGraphicsView *graphicsView = new QGraphicsView(scene); diff --git a/examples/videographicsitem/videoplayer.h b/examples/videographicsitem/videoplayer.h index 2fcbe09..a43911b 100644 --- a/examples/videographicsitem/videoplayer.h +++ b/examples/videographicsitem/videoplayer.h @@ -49,11 +49,9 @@ QT_BEGIN_NAMESPACE class QAbstractButton; class QSlider; +class QGraphicsVideoItem; QT_END_NAMESPACE - -class VideoItem; - class VideoPlayer : public QWidget { Q_OBJECT @@ -76,7 +74,7 @@ private slots: private: QMediaPlayer mediaPlayer; - VideoItem *videoItem; + QGraphicsVideoItem *videoItem; QAbstractButton *playButton; QSlider *positionSlider; }; -- 2.7.4