Use QVideoGraphicsItem in the videographicsitem example.
authorYoann Lopes <yoann.lopes@digia.com>
Mon, 1 Oct 2012 15:50:55 +0000 (17:50 +0200)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Tue, 2 Oct 2012 12:13:46 +0000 (14:13 +0200)
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 <jason.barron@digia.com>
18 files changed:
examples/customvideosurface/customvideoitem/customvideoitem.pro [new file with mode: 0644]
examples/customvideosurface/customvideoitem/main.cpp [new file with mode: 0644]
examples/customvideosurface/customvideoitem/videoitem.cpp [moved from examples/videographicsitem/videoitem.cpp with 100% similarity]
examples/customvideosurface/customvideoitem/videoitem.h [moved from examples/videographicsitem/videoitem.h with 100% similarity]
examples/customvideosurface/customvideoitem/videoplayer.cpp [new file with mode: 0644]
examples/customvideosurface/customvideoitem/videoplayer.h [new file with mode: 0644]
examples/customvideosurface/customvideosurface.pro
examples/customvideosurface/customvideowidget/customvideowidget.pro [new file with mode: 0644]
examples/customvideosurface/customvideowidget/main.cpp [moved from examples/customvideosurface/main.cpp with 100% similarity]
examples/customvideosurface/customvideowidget/videoplayer.cpp [moved from examples/customvideosurface/videoplayer.cpp with 100% similarity]
examples/customvideosurface/customvideowidget/videoplayer.h [moved from examples/customvideosurface/videoplayer.h with 100% similarity]
examples/customvideosurface/customvideowidget/videowidget.cpp [moved from examples/customvideosurface/videowidget.cpp with 100% similarity]
examples/customvideosurface/customvideowidget/videowidget.h [moved from examples/customvideosurface/videowidget.h with 100% similarity]
examples/customvideosurface/customvideowidget/videowidgetsurface.cpp [moved from examples/customvideosurface/videowidgetsurface.cpp with 100% similarity]
examples/customvideosurface/customvideowidget/videowidgetsurface.h [moved from examples/customvideosurface/videowidgetsurface.h with 100% similarity]
examples/videographicsitem/videographicsitem.pro
examples/videographicsitem/videoplayer.cpp
examples/videographicsitem/videoplayer.h

diff --git a/examples/customvideosurface/customvideoitem/customvideoitem.pro b/examples/customvideosurface/customvideoitem/customvideoitem.pro
new file mode 100644 (file)
index 0000000..a2a7a1e
--- /dev/null
@@ -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 (file)
index 0000000..d1899c7
--- /dev/null
@@ -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 <QtWidgets/QApplication>
+
+int main(int argc, char **argv)
+{
+    QApplication app(argc, argv);
+
+    VideoPlayer player;
+    player.show();
+
+    return app.exec();
+}
+
diff --git a/examples/customvideosurface/customvideoitem/videoplayer.cpp b/examples/customvideosurface/customvideoitem/videoplayer.cpp
new file mode 100644 (file)
index 0000000..da4aa88
--- /dev/null
@@ -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 <QtWidgets>
+#include <qvideosurfaceformat.h>
+
+#if !defined(QT_NO_OPENGL)
+# include <QtOpenGL/QGLWidget>
+#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 (file)
index 0000000..2fcbe09
--- /dev/null
@@ -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 <qmediaplayer.h>
+
+#include <QtGui/QMovie>
+#include <QtWidgets/QWidget>
+
+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
+
index 9ddb7ed..1230f2c 100644 (file)
@@ -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 (file)
index 0000000..c3ac2cd
--- /dev/null
@@ -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
index 66ed4f6..a0a3cdc 100644 (file)
@@ -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
index da4aa88..4cf1c08 100644 (file)
 ****************************************************************************/
 
 #include "videoplayer.h"
-#include "videoitem.h"
 
 #include <QtWidgets>
 #include <qvideosurfaceformat.h>
+#include <qgraphicsvideoitem.h>
 
 #if !defined(QT_NO_OPENGL)
 # include <QtOpenGL/QGLWidget>
@@ -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);
index 2fcbe09..a43911b 100644 (file)
 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;
 };