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(QTKIT)
39 #include "QTKitFullScreenVideoHandler.h"
40 #endif
41
42 #if USE(QT_MULTIMEDIA)
43 #include <QGraphicsVideoItem>
44 #include <QMediaPlayer>
45 #endif
46 #include <QWidget>
47
48 namespace WebCore {
49
50 #if USE(GSTREAMER)
GStreamerFullScreenVideoHandler()51 GStreamerFullScreenVideoHandler::GStreamerFullScreenVideoHandler()
52 : m_videoElement(0)
53 , m_fullScreenWidget(0)
54 {
55 }
56
setVideoElement(HTMLVideoElement * element)57 void GStreamerFullScreenVideoHandler::setVideoElement(HTMLVideoElement* element)
58 {
59 m_videoElement = element;
60 }
61
enterFullScreen()62 void GStreamerFullScreenVideoHandler::enterFullScreen()
63 {
64 if (m_videoElement->platformMedia().type != WebCore::PlatformMedia::GStreamerGWorldType)
65 return;
66
67 GStreamerGWorld* gstreamerGWorld = m_videoElement->platformMedia().media.gstreamerGWorld;
68
69 if (!gstreamerGWorld->enterFullscreen())
70 return;
71
72 m_fullScreenWidget = reinterpret_cast<FullScreenVideoWindow*>(gstreamerGWorld->platformVideoWindow()->window());
73 m_fullScreenWidget->setVideoElement(m_videoElement);
74 connect(m_fullScreenWidget, SIGNAL(closed()), this, SLOT(windowClosed()));
75 m_fullScreenWidget->showFullScreen();
76 }
77
windowClosed()78 void GStreamerFullScreenVideoHandler::windowClosed()
79 {
80 m_videoElement->exitFullscreen();
81 }
82
exitFullScreen()83 void GStreamerFullScreenVideoHandler::exitFullScreen()
84 {
85 if (m_videoElement->platformMedia().type == WebCore::PlatformMedia::GStreamerGWorldType)
86 m_videoElement->platformMedia().media.gstreamerGWorld->exitFullscreen();
87
88 m_fullScreenWidget->setVideoElement(0);
89 m_fullScreenWidget->close();
90 }
91 #endif
92
93 #if USE(QT_MULTIMEDIA)
94 bool DefaultFullScreenVideoHandler::s_shouldForceFullScreenVideoPlayback = false;
95
DefaultFullScreenVideoHandler()96 DefaultFullScreenVideoHandler::DefaultFullScreenVideoHandler()
97 : QWebFullScreenVideoHandler()
98 , m_fullScreenWidget(new FullScreenVideoWidget)
99 {
100 connect(m_fullScreenWidget, SIGNAL(didExitFullScreen()), this, SIGNAL(fullScreenClosed()));
101 m_fullScreenWidget->hide();
102
103 m_fullScreenWidget->close();
104 }
105
~DefaultFullScreenVideoHandler()106 DefaultFullScreenVideoHandler::~DefaultFullScreenVideoHandler()
107 {
108 delete m_fullScreenWidget;
109 }
110
requiresFullScreenForVideoPlayback() const111 bool DefaultFullScreenVideoHandler::requiresFullScreenForVideoPlayback() const
112 {
113 static bool initialized = false;
114 if (!initialized) {
115 QByteArray forceFullScreen = qgetenv("QT_WEBKIT_FORCE_FULLSCREEN_VIDEO");
116 if (!forceFullScreen.isEmpty())
117 s_shouldForceFullScreenVideoPlayback = true;
118
119 initialized = true;
120 }
121
122 return s_shouldForceFullScreenVideoPlayback;
123 }
124
enterFullScreen(QMediaPlayer * player)125 void DefaultFullScreenVideoHandler::enterFullScreen(QMediaPlayer* player)
126 {
127 m_fullScreenWidget->show(player);
128 }
129
exitFullScreen()130 void DefaultFullScreenVideoHandler::exitFullScreen()
131 {
132 m_fullScreenWidget->close();
133 }
134 #endif
135
FullScreenVideoQt(ChromeClientQt * chromeClient)136 FullScreenVideoQt::FullScreenVideoQt(ChromeClientQt* chromeClient)
137 : m_chromeClient(chromeClient)
138 , m_videoElement(0)
139 {
140 Q_ASSERT(m_chromeClient);
141
142 #if USE(QT_MULTIMEDIA)
143 m_FullScreenVideoHandler = m_chromeClient->m_platformPlugin.createFullScreenVideoHandler().leakPtr();
144 if (!m_FullScreenVideoHandler)
145 m_FullScreenVideoHandler = new DefaultFullScreenVideoHandler;
146
147 if (m_FullScreenVideoHandler)
148 connect(m_FullScreenVideoHandler, SIGNAL(fullScreenClosed()), this, SLOT(aboutToClose()));
149 #endif
150
151 #if USE(GSTREAMER)
152 m_FullScreenVideoHandlerGStreamer = new GStreamerFullScreenVideoHandler;
153 #endif
154
155 #if USE(QTKIT)
156 m_FullScreenVideoHandlerQTKit = new QTKitFullScreenVideoHandler;
157 #endif
158 }
159
~FullScreenVideoQt()160 FullScreenVideoQt::~FullScreenVideoQt()
161 {
162 #if USE(QT_MULTIMEDIA)
163 delete m_FullScreenVideoHandler;
164 #endif
165 #if USE(GSTREAMER)
166 delete m_FullScreenVideoHandlerGStreamer;
167 #endif
168 #if USE(QTKIT)
169 delete m_FullScreenVideoHandlerQTKit;
170 #endif
171 }
172
enterFullScreenForNode(Node * node)173 void FullScreenVideoQt::enterFullScreenForNode(Node* node)
174 {
175 Q_ASSERT(node);
176 m_videoElement = static_cast<HTMLVideoElement*>(node);
177
178 #if USE(QT_MULTIMEDIA)
179 Q_ASSERT(m_FullScreenVideoHandler);
180 HTMLVideoElement* videoElement = static_cast<HTMLVideoElement*>(node);
181 PlatformMedia platformMedia = videoElement->platformMedia();
182
183 ASSERT(platformMedia.type == PlatformMedia::QtMediaPlayerType);
184 if (platformMedia.type != PlatformMedia::QtMediaPlayerType)
185 return;
186
187 if (!m_FullScreenVideoHandler)
188 return;
189
190 MediaPlayerPrivateQt* mediaPlayerQt = mediaPlayer();
191 mediaPlayerQt->removeVideoItem();
192 m_FullScreenVideoHandler->enterFullScreen(mediaPlayerQt->mediaPlayer());
193 #endif
194
195 #if USE(GSTREAMER)
196 m_FullScreenVideoHandlerGStreamer->setVideoElement(m_videoElement);
197 m_FullScreenVideoHandlerGStreamer->enterFullScreen();
198 #endif
199
200 #if USE(QTKIT)
201 m_FullScreenVideoHandlerQTKit->enterFullScreen(m_videoElement);
202 #endif
203 }
204
exitFullScreenForNode(Node * node)205 void FullScreenVideoQt::exitFullScreenForNode(Node* node)
206 {
207 Q_ASSERT(node);
208
209 #if USE(QT_MULTIMEDIA)
210 HTMLVideoElement* videoElement = static_cast<HTMLVideoElement*>(node);
211 PlatformMedia platformMedia = videoElement->platformMedia();
212
213 ASSERT(platformMedia.type == PlatformMedia::QtMediaPlayerType);
214 if (platformMedia.type != PlatformMedia::QtMediaPlayerType)
215 return;
216
217 Q_ASSERT(m_FullScreenVideoHandler);
218
219 if (!m_FullScreenVideoHandler)
220 return;
221
222 m_FullScreenVideoHandler->exitFullScreen();
223 MediaPlayerPrivateQt* mediaPlayerQt = mediaPlayer();
224 mediaPlayerQt->restoreVideoItem();
225 #endif
226 #if USE(GSTREAMER)
227 m_FullScreenVideoHandlerGStreamer->exitFullScreen();
228 #endif
229
230 #if USE(QTKIT)
231 m_FullScreenVideoHandlerQTKit->exitFullScreen();
232 #endif
233
234 }
235
aboutToClose()236 void FullScreenVideoQt::aboutToClose()
237 {
238 Q_ASSERT(m_videoElement);
239 m_videoElement->exitFullscreen();
240 }
241
242 #if USE(QT_MULTIMEDIA)
mediaPlayer()243 MediaPlayerPrivateQt* FullScreenVideoQt::mediaPlayer()
244 {
245 Q_ASSERT(m_videoElement);
246 PlatformMedia platformMedia = m_videoElement->platformMedia();
247 return static_cast<MediaPlayerPrivateQt*>(platformMedia.media.qtMediaPlayer);
248 }
249 #endif
250
requiresFullScreenForVideoPlayback()251 bool FullScreenVideoQt::requiresFullScreenForVideoPlayback()
252 {
253 #if USE(QT_MULTIMEDIA)
254 return m_FullScreenVideoHandler ? m_FullScreenVideoHandler->requiresFullScreenForVideoPlayback() : false;
255 #else
256 return false;
257 #endif
258 }
259
isValid() const260 bool FullScreenVideoQt::isValid() const
261 {
262 #if USE(QT_MULTIMEDIA)
263 return m_FullScreenVideoHandler;
264 #endif
265 #if USE(GSTREAMER)
266 return m_FullScreenVideoHandlerGStreamer;
267 #elif USE(QTKIT)
268 return m_FullScreenVideoHandlerQTKit;
269 #else
270 return 0;
271 #endif
272 }
273
274 }
275
276