1/*
2 * Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies)
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
8 *
9 * This library 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 GNU
12 * Library General Public License for more details.
13 *
14 * You should have received a copy of the GNU Library General Public License
15 * along with this library; see the file COPYING.LIB.  If not, write to
16 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
18 *
19 */
20
21#include "config.h"
22#include "FullScreenVideoQt.h"
23
24#include "ChromeClientQt.h"
25#if USE(QT_MULTIMEDIA)
26#include "FullScreenVideoWidget.h"
27#include "MediaPlayerPrivateQt.h"
28#endif
29#include "HTMLNames.h"
30#include "HTMLVideoElement.h"
31#include "Node.h"
32
33#if USE(GSTREAMER)
34#include "GStreamerGWorld.h"
35#include "PlatformVideoWindowPrivate.h"
36#endif
37
38#if USE(QT_MULTIMEDIA)
39#include <QGraphicsVideoItem>
40#include <QMediaPlayer>
41#endif
42#include <QWidget>
43
44namespace WebCore {
45
46#if USE(GSTREAMER)
47GStreamerFullScreenVideoHandler::GStreamerFullScreenVideoHandler()
48    : m_videoElement(0)
49    , m_fullScreenWidget(0)
50{
51}
52
53void GStreamerFullScreenVideoHandler::setVideoElement(HTMLVideoElement* element)
54{
55    m_videoElement = element;
56}
57
58void GStreamerFullScreenVideoHandler::enterFullScreen()
59{
60    if (m_videoElement->platformMedia().type != WebCore::PlatformMedia::GStreamerGWorldType)
61        return;
62
63    GStreamerGWorld* gstreamerGWorld = m_videoElement->platformMedia().media.gstreamerGWorld;
64
65    if (!gstreamerGWorld->enterFullscreen())
66        return;
67
68    m_fullScreenWidget = reinterpret_cast<FullScreenVideoWindow*>(gstreamerGWorld->platformVideoWindow()->window());
69    m_fullScreenWidget->setVideoElement(m_videoElement);
70    connect(m_fullScreenWidget, SIGNAL(closed()), this, SLOT(windowClosed()));
71    m_fullScreenWidget->showFullScreen();
72}
73
74void GStreamerFullScreenVideoHandler::windowClosed()
75{
76    m_videoElement->exitFullscreen();
77}
78
79void GStreamerFullScreenVideoHandler::exitFullScreen()
80{
81    if (m_videoElement->platformMedia().type == WebCore::PlatformMedia::GStreamerGWorldType)
82        m_videoElement->platformMedia().media.gstreamerGWorld->exitFullscreen();
83
84    m_fullScreenWidget->setVideoElement(0);
85    m_fullScreenWidget->close();
86}
87#endif
88
89#if USE(QT_MULTIMEDIA)
90bool DefaultFullScreenVideoHandler::s_shouldForceFullScreenVideoPlayback = false;
91
92DefaultFullScreenVideoHandler::DefaultFullScreenVideoHandler()
93    : QWebFullScreenVideoHandler()
94    , m_fullScreenWidget(new FullScreenVideoWidget)
95{
96    connect(m_fullScreenWidget, SIGNAL(didExitFullScreen()), this, SIGNAL(fullScreenClosed()));
97    m_fullScreenWidget->hide();
98
99    m_fullScreenWidget->close();
100}
101
102DefaultFullScreenVideoHandler::~DefaultFullScreenVideoHandler()
103{
104    delete m_fullScreenWidget;
105}
106
107bool DefaultFullScreenVideoHandler::requiresFullScreenForVideoPlayback() const
108{
109    static bool initialized = false;
110    if (!initialized) {
111        QByteArray forceFullScreen = qgetenv("QT_WEBKIT_FORCE_FULLSCREEN_VIDEO");
112        if (!forceFullScreen.isEmpty())
113            s_shouldForceFullScreenVideoPlayback = true;
114
115        initialized = true;
116    }
117
118    return s_shouldForceFullScreenVideoPlayback;
119}
120
121void DefaultFullScreenVideoHandler::enterFullScreen(QMediaPlayer* player)
122{
123    m_fullScreenWidget->show(player);
124}
125
126void DefaultFullScreenVideoHandler::exitFullScreen()
127{
128    m_fullScreenWidget->close();
129}
130#endif
131
132FullScreenVideoQt::FullScreenVideoQt(ChromeClientQt* chromeClient)
133    : m_chromeClient(chromeClient)
134    , m_videoElement(0)
135{
136    Q_ASSERT(m_chromeClient);
137
138#if USE(QT_MULTIMEDIA)
139    m_FullScreenVideoHandler = m_chromeClient->m_platformPlugin.createFullScreenVideoHandler();
140    if (!m_FullScreenVideoHandler)
141        m_FullScreenVideoHandler = new DefaultFullScreenVideoHandler;
142
143    if (m_FullScreenVideoHandler)
144        connect(m_FullScreenVideoHandler, SIGNAL(fullScreenClosed()), this, SLOT(aboutToClose()));
145#endif
146
147#if USE(GSTREAMER)
148    m_FullScreenVideoHandlerGStreamer = new GStreamerFullScreenVideoHandler;
149#endif
150}
151
152FullScreenVideoQt::~FullScreenVideoQt()
153{
154#if USE(QT_MULTIMEDIA)
155    delete m_FullScreenVideoHandler;
156#endif
157#if USE(GSTREAMER)
158    delete m_FullScreenVideoHandlerGStreamer;
159#endif
160}
161
162void FullScreenVideoQt::enterFullScreenForNode(Node* node)
163{
164    Q_ASSERT(node);
165    Q_ASSERT(m_FullScreenVideoHandler);
166
167    m_videoElement = static_cast<HTMLVideoElement*>(node);
168
169#if USE(QT_MULTIMEDIA)
170    HTMLVideoElement* videoElement = static_cast<HTMLVideoElement*>(node);
171    PlatformMedia platformMedia = videoElement->platformMedia();
172
173    ASSERT(platformMedia.type == PlatformMedia::QtMediaPlayerType);
174    if (platformMedia.type != PlatformMedia::QtMediaPlayerType)
175        return;
176
177    if (!m_FullScreenVideoHandler)
178        return;
179
180    MediaPlayerPrivateQt* mediaPlayerQt = mediaPlayer();
181    mediaPlayerQt->removeVideoItem();
182    m_FullScreenVideoHandler->enterFullScreen(mediaPlayerQt->mediaPlayer());
183#endif
184
185#if USE(GSTREAMER)
186    m_FullScreenVideoHandlerGStreamer->setVideoElement(m_videoElement);
187    m_FullScreenVideoHandlerGStreamer->enterFullScreen();
188#endif
189}
190
191void FullScreenVideoQt::exitFullScreenForNode(Node* node)
192{
193    Q_ASSERT(node);
194
195#if USE(QT_MULTIMEDIA)
196    HTMLVideoElement* videoElement = static_cast<HTMLVideoElement*>(node);
197    PlatformMedia platformMedia = videoElement->platformMedia();
198
199    ASSERT(platformMedia.type == PlatformMedia::QtMediaPlayerType);
200    if (platformMedia.type != PlatformMedia::QtMediaPlayerType)
201        return;
202
203    Q_ASSERT(m_FullScreenVideoHandler);
204
205    if (!m_FullScreenVideoHandler)
206        return;
207
208    m_FullScreenVideoHandler->exitFullScreen();
209    MediaPlayerPrivateQt* mediaPlayerQt = mediaPlayer();
210    mediaPlayerQt->restoreVideoItem();
211#endif
212#if USE(GSTREAMER)
213    m_FullScreenVideoHandlerGStreamer->exitFullScreen();
214#endif
215}
216
217void FullScreenVideoQt::aboutToClose()
218{
219    Q_ASSERT(m_videoElement);
220    m_videoElement->exitFullscreen();
221}
222
223#if USE(QT_MULTIMEDIA)
224MediaPlayerPrivateQt* FullScreenVideoQt::mediaPlayer()
225{
226    Q_ASSERT(m_videoElement);
227    PlatformMedia platformMedia = m_videoElement->platformMedia();
228    return static_cast<MediaPlayerPrivateQt*>(platformMedia.media.qtMediaPlayer);
229}
230#endif
231
232bool FullScreenVideoQt::requiresFullScreenForVideoPlayback()
233{
234#if USE(QT_MULTIMEDIA)
235    return m_FullScreenVideoHandler ? m_FullScreenVideoHandler->requiresFullScreenForVideoPlayback() : false;
236#endif
237#if USE(GSTREAMER)
238    return false;
239#endif
240}
241
242bool FullScreenVideoQt::isValid() const
243{
244#if USE(QT_MULTIMEDIA)
245    return m_FullScreenVideoHandler;
246#endif
247#if USE(GSTREAMER)
248    return m_FullScreenVideoHandlerGStreamer;
249#endif
250}
251
252}
253
254