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
44 namespace WebCore {
45
46 #if USE(GSTREAMER)
GStreamerFullScreenVideoHandler()47 GStreamerFullScreenVideoHandler::GStreamerFullScreenVideoHandler()
48 : m_videoElement(0)
49 , m_fullScreenWidget(0)
50 {
51 }
52
setVideoElement(HTMLVideoElement * element)53 void GStreamerFullScreenVideoHandler::setVideoElement(HTMLVideoElement* element)
54 {
55 m_videoElement = element;
56 }
57
enterFullScreen()58 void 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
windowClosed()74 void GStreamerFullScreenVideoHandler::windowClosed()
75 {
76 m_videoElement->exitFullscreen();
77 }
78
exitFullScreen()79 void 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)
90 bool DefaultFullScreenVideoHandler::s_shouldForceFullScreenVideoPlayback = false;
91
DefaultFullScreenVideoHandler()92 DefaultFullScreenVideoHandler::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
~DefaultFullScreenVideoHandler()102 DefaultFullScreenVideoHandler::~DefaultFullScreenVideoHandler()
103 {
104 delete m_fullScreenWidget;
105 }
106
requiresFullScreenForVideoPlayback() const107 bool 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
enterFullScreen(QMediaPlayer * player)121 void DefaultFullScreenVideoHandler::enterFullScreen(QMediaPlayer* player)
122 {
123 m_fullScreenWidget->show(player);
124 }
125
exitFullScreen()126 void DefaultFullScreenVideoHandler::exitFullScreen()
127 {
128 m_fullScreenWidget->close();
129 }
130 #endif
131
FullScreenVideoQt(ChromeClientQt * chromeClient)132 FullScreenVideoQt::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
~FullScreenVideoQt()152 FullScreenVideoQt::~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
enterFullScreenForNode(Node * node)162 void 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
exitFullScreenForNode(Node * node)191 void 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
aboutToClose()217 void FullScreenVideoQt::aboutToClose()
218 {
219 Q_ASSERT(m_videoElement);
220 m_videoElement->exitFullscreen();
221 }
222
223 #if USE(QT_MULTIMEDIA)
mediaPlayer()224 MediaPlayerPrivateQt* 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
requiresFullScreenForVideoPlayback()232 bool 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
isValid() const242 bool 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