1dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/*
2dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
3dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
4dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    This library is free software; you can redistribute it and/or
5dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    modify it under the terms of the GNU Library General Public
6dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    License as published by the Free Software Foundation; either
7dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    version 2 of the License, or (at your option) any later version.
8dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
9dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    This library is distributed in the hope that it will be useful,
10dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    but WITHOUT ANY WARRANTY; without even the implied warranty of
11dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Library General Public License for more details.
13dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
14dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    You should have received a copy of the GNU Library General Public License
15dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    along with this library; see the file COPYING.LIB.  If not, write to
16dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Boston, MA 02110-1301, USA.
18dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block*/
19dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
20dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "config.h"
21dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "MediaPlayerPrivateQt.h"
22dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
23dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "FrameView.h"
24dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "GraphicsContext.h"
25dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "HTMLMediaElement.h"
26dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "HTMLVideoElement.h"
2768513a70bcd92384395513322f1b801e7bf9c729Steve Block#include "NetworkingContext.h"
28f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick#include "NotImplemented.h"
29a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "RenderVideo.h"
30dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "TimeRanges.h"
31dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "Widget.h"
32dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "qwebframe.h"
33dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "qwebpage.h"
34dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
35dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <QGraphicsScene>
36dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <QGraphicsVideoItem>
37dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <QMediaPlayerControl>
38dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <QMediaService>
39dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <QNetworkAccessManager>
40dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <QNetworkCookieJar>
41dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <QNetworkRequest>
42dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <QPainter>
43dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <QPoint>
44dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <QRect>
45a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include <QStyleOptionGraphicsItem>
46dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <QTime>
47dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <QTimer>
48dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <QUrl>
49dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <limits>
50dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <wtf/HashSet.h>
51dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <wtf/text/CString.h>
52dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
53a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#if USE(ACCELERATED_COMPOSITING)
54a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "texmap/TextureMapperPlatformLayer.h"
55a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#endif
56a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
57dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockusing namespace WTF;
58dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
59dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocknamespace WebCore {
60dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
61bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenMediaPlayerPrivateInterface* MediaPlayerPrivateQt::create(MediaPlayer* player)
62dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
63bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    return new MediaPlayerPrivateQt(player);
64dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
65dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
66bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid MediaPlayerPrivateQt::registerMediaEngine(MediaEngineRegistrar registrar)
67dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
6881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    registrar(create, getSupportedTypes, supportsType, 0, 0, 0);
69dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
70dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
71bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid MediaPlayerPrivateQt::getSupportedTypes(HashSet<String> &supported)
72dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
73dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    QStringList types = QMediaPlayer::supportedMimeTypes();
74dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
75dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    for (int i = 0; i < types.size(); i++) {
76dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        QString mime = types.at(i);
772bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (mime.startsWith(QString::fromLatin1("audio/")) || mime.startsWith(QString::fromLatin1("video/")))
78dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            supported.add(mime);
79dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
80dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
81dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
82bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenMediaPlayer::SupportsType MediaPlayerPrivateQt::supportsType(const String& mime, const String& codec)
83dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
84dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!mime.startsWith("audio/") && !mime.startsWith("video/"))
85dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return MediaPlayer::IsNotSupported;
86dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // Parse and trim codecs.
882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    QString codecStr = codec;
892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    QStringList codecList = codecStr.split(QLatin1Char(','), QString::SkipEmptyParts);
902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    QStringList codecListTrimmed;
912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    foreach (const QString& codecStrNotTrimmed, codecList) {
922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        QString codecStrTrimmed = codecStrNotTrimmed.trimmed();
932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (!codecStrTrimmed.isEmpty())
942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            codecListTrimmed.append(codecStrTrimmed);
952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (QMediaPlayer::hasSupport(mime, codecListTrimmed) >= QtMultimediaKit::ProbablySupported)
98dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return MediaPlayer::IsSupported;
99dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
100dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return MediaPlayer::MayBeSupported;
101dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
102dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
103bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenMediaPlayerPrivateQt::MediaPlayerPrivateQt(MediaPlayer* player)
104bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    : m_webCorePlayer(player)
105dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    , m_mediaPlayer(new QMediaPlayer)
106dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    , m_mediaPlayerControl(0)
107dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    , m_videoItem(new QGraphicsVideoItem)
108dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    , m_videoScene(new QGraphicsScene)
109dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    , m_networkState(MediaPlayer::Empty)
110dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    , m_readyState(MediaPlayer::HaveNothing)
111a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    , m_currentSize(0, 0)
112a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    , m_naturalSize(RenderVideo::defaultSize())
113dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    , m_isVisible(false)
114dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    , m_isSeeking(false)
115dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    , m_composited(false)
116f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    , m_preload(MediaPlayer::Auto)
11781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    , m_suppressNextPlaybackChanged(false)
118dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
11965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_mediaPlayer->setVideoOutput(m_videoItem);
120dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_videoScene->addItem(m_videoItem);
121dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
122dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Signal Handlers
123dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    connect(m_mediaPlayer, SIGNAL(mediaStatusChanged(QMediaPlayer::MediaStatus)),
124dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            this, SLOT(mediaStatusChanged(QMediaPlayer::MediaStatus)));
125dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    connect(m_mediaPlayer, SIGNAL(stateChanged(QMediaPlayer::State)),
126dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            this, SLOT(stateChanged(QMediaPlayer::State)));
127dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    connect(m_mediaPlayer, SIGNAL(error(QMediaPlayer::Error)),
128dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            this, SLOT(handleError(QMediaPlayer::Error)));
129f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    connect(m_mediaPlayer, SIGNAL(bufferStatusChanged(int)),
130f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            this, SLOT(bufferStatusChanged(int)));
131dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    connect(m_mediaPlayer, SIGNAL(durationChanged(qint64)),
132dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            this, SLOT(durationChanged(qint64)));
133dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    connect(m_mediaPlayer, SIGNAL(positionChanged(qint64)),
134dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            this, SLOT(positionChanged(qint64)));
135dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    connect(m_mediaPlayer, SIGNAL(volumeChanged(int)),
136dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            this, SLOT(volumeChanged(int)));
137dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    connect(m_mediaPlayer, SIGNAL(mutedChanged(bool)),
138dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            this, SLOT(mutedChanged(bool)));
139dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    connect(m_videoScene, SIGNAL(changed(QList<QRectF>)),
140dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            this, SLOT(repaint()));
141dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    connect(m_videoItem, SIGNAL(nativeSizeChanged(QSizeF)),
142dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block           this, SLOT(nativeSizeChanged(QSizeF)));
143dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
144dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Grab the player control
145a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (QMediaService* service = m_mediaPlayer->service()) {
146dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_mediaPlayerControl = qobject_cast<QMediaPlayerControl *>(
147e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke                service->requestControl(QMediaPlayerControl_iid));
148dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
149dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
150dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
151bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenMediaPlayerPrivateQt::~MediaPlayerPrivateQt()
152dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
153a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    m_mediaPlayer->disconnect(this);
154a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    m_mediaPlayer->stop();
155a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    m_mediaPlayer->setMedia(QMediaContent());
156a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
157dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    delete m_mediaPlayer;
158dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    delete m_videoScene;
159dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
160dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
161bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenbool MediaPlayerPrivateQt::hasVideo() const
162dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
163dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return m_mediaPlayer->isVideoAvailable();
164dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
165dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
166bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenbool MediaPlayerPrivateQt::hasAudio() const
167dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
168dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return true;
169dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
170dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
171bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid MediaPlayerPrivateQt::load(const String& url)
172dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
173f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    m_mediaUrl = url;
174f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
175f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    // QtMultimedia does not have an API to throttle loading
176f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    // so we handle this ourselves by delaying the load
177f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    if (m_preload == MediaPlayer::None) {
178f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        m_delayingLoad = true;
179f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        return;
180f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    }
181f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
182f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    commitLoad(url);
183f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick}
184f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
185bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid MediaPlayerPrivateQt::commitLoad(const String& url)
186f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick{
187dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // We are now loading
188dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (m_networkState != MediaPlayer::Loading) {
189dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_networkState = MediaPlayer::Loading;
190bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        m_webCorePlayer->networkStateChanged();
191dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
192dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
193dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // And we don't have any data yet
194dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (m_readyState != MediaPlayer::HaveNothing) {
195dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_readyState = MediaPlayer::HaveNothing;
196bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        m_webCorePlayer->readyStateChanged();
197dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
198dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
19981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    KURL kUrl(ParsedURLString, url);
20081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    const QUrl rUrl = kUrl;
201dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    const QString scheme = rUrl.scheme().toLower();
202dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
203dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Grab the client media element
204bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    HTMLMediaElement* element = static_cast<HTMLMediaElement*>(m_webCorePlayer->mediaPlayerClient());
205dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
206dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Construct the media content with a network request if the resource is http[s]
2072bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (scheme == QString::fromLatin1("http") || scheme == QString::fromLatin1("https")) {
208dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        QNetworkRequest request = QNetworkRequest(rUrl);
209dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
210dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // Grab the current document
211dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        Document* document = element->document();
212dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (!document)
213dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            document = element->ownerDocument();
214dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
215dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // Grab the frame and network manager
216dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        Frame* frame = document ? document->frame() : 0;
217ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        FrameLoader* frameLoader = frame ? frame->loader() : 0;
218ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        QNetworkAccessManager* manager = frameLoader ? frameLoader->networkingContext()->networkAccessManager() : 0;
219dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
220ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        if (manager) {
221dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            // Set the cookies
22281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            QNetworkCookieJar* jar = manager->cookieJar();
22381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            QList<QNetworkCookie> cookies = jar->cookiesForUrl(rUrl);
224dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
225dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            // Don't set the header if there are no cookies.
226dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            // This prevents a warning from being emitted.
227dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            if (!cookies.isEmpty())
2282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                request.setHeader(QNetworkRequest::CookieHeader, QVariant::fromValue(cookies));
229dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
230dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            // Set the refferer, but not when requesting insecure content from a secure page
231dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            QUrl documentUrl = QUrl(QString(document->documentURI()));
2322bde8e466a4451c7319e3a072d118917957d6554Steve Block            if (documentUrl.scheme().toLower() == QString::fromLatin1("http") || scheme == QString::fromLatin1("https"))
233dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                request.setRawHeader("Referer", documentUrl.toEncoded());
234dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
235dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            // Set the user agent
236dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            request.setRawHeader("User-Agent", frameLoader->userAgent(rUrl).utf8().data());
237dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
238dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
239dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_mediaPlayer->setMedia(QMediaContent(request));
240dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } else {
241dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // Otherwise, just use the URL
242dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_mediaPlayer->setMedia(QMediaContent(rUrl));
243dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
244dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
245dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Set the current volume and mute status
246dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // We get these from the element, rather than the player, in case we have
247dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // transitioned from a media engine which doesn't support muting, to a media
248dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // engine which does.
249dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_mediaPlayer->setMuted(element->muted());
250dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_mediaPlayer->setVolume(static_cast<int>(element->volume() * 100.0));
251f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
25281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // Don't send PlaybackChanged notification for pre-roll.
25381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_suppressNextPlaybackChanged = true;
25481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
255f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    // Setting a media source will start loading the media, but we need
256f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    // to pre-roll as well to get video size-hints and buffer-status
257f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    if (element->paused())
258f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        m_mediaPlayer->pause();
259f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    else
260f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        m_mediaPlayer->play();
261f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick}
262f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
263bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid MediaPlayerPrivateQt::resumeLoad()
264f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick{
265f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    m_delayingLoad = false;
266f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
267f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    if (!m_mediaUrl.isNull())
268f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        commitLoad(m_mediaUrl);
269dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
270dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
271bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid MediaPlayerPrivateQt::cancelLoad()
272dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
273dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_mediaPlayer->setMedia(QMediaContent());
274dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    updateStates();
275dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
276dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
277bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid MediaPlayerPrivateQt::prepareToPlay()
278f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick{
279f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    if (m_mediaPlayer->media().isNull() || m_delayingLoad)
280f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        resumeLoad();
281f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick}
282f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
283bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid MediaPlayerPrivateQt::play()
284dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
285dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (m_mediaPlayer->state() != QMediaPlayer::PlayingState)
286dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_mediaPlayer->play();
287dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
288dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
289bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid MediaPlayerPrivateQt::pause()
290dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
291dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (m_mediaPlayer->state() == QMediaPlayer::PlayingState)
292dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_mediaPlayer->pause();
293dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
294dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
295bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenbool MediaPlayerPrivateQt::paused() const
296dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
297dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return (m_mediaPlayer->state() != QMediaPlayer::PlayingState);
298dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
299dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
300bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid MediaPlayerPrivateQt::seek(float position)
301dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
302dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!m_mediaPlayer->isSeekable())
303dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return;
304dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
305dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (m_mediaPlayerControl && !m_mediaPlayerControl->availablePlaybackRanges().contains(position * 1000))
306dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return;
307dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
3082bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_isSeeking = true;
3092bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_mediaPlayer->setPosition(static_cast<qint64>(position * 1000));
310dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
311dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
312bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenbool MediaPlayerPrivateQt::seeking() const
313dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
314dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return m_isSeeking;
315dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
316dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
317bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenfloat MediaPlayerPrivateQt::duration() const
318dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
319dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (m_readyState < MediaPlayer::HaveMetadata)
320dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return 0.0f;
321dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
322dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    float duration = m_mediaPlayer->duration() / 1000.0f;
323dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
324dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // We are streaming
325dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (duration <= 0.0f)
326dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        duration = std::numeric_limits<float>::infinity();
327dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
328dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return duration;
329dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
330dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
331bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenfloat MediaPlayerPrivateQt::currentTime() const
332dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
333a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    return m_mediaPlayer->position() / 1000.0f;
334dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
335dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
336bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenPassRefPtr<TimeRanges> MediaPlayerPrivateQt::buffered() const
337dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
338dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    RefPtr<TimeRanges> buffered = TimeRanges::create();
339dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
340dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!m_mediaPlayerControl)
341dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return buffered;
342dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
343dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    QMediaTimeRange playbackRanges = m_mediaPlayerControl->availablePlaybackRanges();
344dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
345dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    foreach (const QMediaTimeInterval interval, playbackRanges.intervals()) {
346dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        float rangeMin = static_cast<float>(interval.start()) / 1000.0f;
347dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        float rangeMax = static_cast<float>(interval.end()) / 1000.0f;
348dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        buffered->add(rangeMin, rangeMax);
349dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
350dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
351dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return buffered.release();
352dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
353dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
354bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenfloat MediaPlayerPrivateQt::maxTimeSeekable() const
355dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
356dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!m_mediaPlayerControl)
357dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return 0;
358dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
359dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return static_cast<float>(m_mediaPlayerControl->availablePlaybackRanges().latestTime()) / 1000.0f;
360dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
361dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
362bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenunsigned MediaPlayerPrivateQt::bytesLoaded() const
363dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
364dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    QLatin1String bytesLoadedKey("bytes-loaded");
365dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (m_mediaPlayer->availableExtendedMetaData().contains(bytesLoadedKey))
366dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return m_mediaPlayer->extendedMetaData(bytesLoadedKey).toInt();
367dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
368f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    return m_mediaPlayer->bufferStatus();
369dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
370dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
371bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenunsigned MediaPlayerPrivateQt::totalBytes() const
372dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
373e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    if (m_mediaPlayer->availableMetaData().contains(QtMultimediaKit::Size))
374e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        return m_mediaPlayer->metaData(QtMultimediaKit::Size).toInt();
375dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
376dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return 100;
377dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
378dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
379bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid MediaPlayerPrivateQt::setPreload(MediaPlayer::Preload preload)
380f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick{
381f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    m_preload = preload;
382f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    if (m_delayingLoad && m_preload != MediaPlayer::None)
383f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        resumeLoad();
384f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick}
385f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
386bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid MediaPlayerPrivateQt::setRate(float rate)
387dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
388dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_mediaPlayer->setPlaybackRate(rate);
389dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
390dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
391bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid MediaPlayerPrivateQt::setVolume(float volume)
392dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
393dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_mediaPlayer->setVolume(static_cast<int>(volume * 100.0));
394dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
395dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
396bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenbool MediaPlayerPrivateQt::supportsMuting() const
397dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
398dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return true;
399dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
400dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
401bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid MediaPlayerPrivateQt::setMuted(bool muted)
402dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
403dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_mediaPlayer->setMuted(muted);
404dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
405dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
406bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenMediaPlayer::NetworkState MediaPlayerPrivateQt::networkState() const
407dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
408dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return m_networkState;
409dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
410dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
411bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenMediaPlayer::ReadyState MediaPlayerPrivateQt::readyState() const
412dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
413dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return m_readyState;
414dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
415dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
416bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid MediaPlayerPrivateQt::setVisible(bool visible)
417dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
418dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_isVisible = visible;
419dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
420dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
421bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid MediaPlayerPrivateQt::mediaStatusChanged(QMediaPlayer::MediaStatus)
422dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
423dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    updateStates();
424dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
425dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
426bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid MediaPlayerPrivateQt::handleError(QMediaPlayer::Error)
427dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
428dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    updateStates();
429dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
430dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
4312bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid MediaPlayerPrivateQt::stateChanged(QMediaPlayer::State)
432dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
43381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (!m_suppressNextPlaybackChanged)
43481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        m_webCorePlayer->playbackStateChanged();
43581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    else
43681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        m_suppressNextPlaybackChanged = false;
437dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
438dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
439a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid MediaPlayerPrivateQt::nativeSizeChanged(const QSizeF& size)
440dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
441a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    LOG(Media, "MediaPlayerPrivateQt::naturalSizeChanged(%dx%d)",
442a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            size.toSize().width(), size.toSize().height());
443a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
444a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (!size.isValid())
445a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return;
446a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
447a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    m_naturalSize = size.toSize();
448bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    m_webCorePlayer->sizeChanged();
449dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
450dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
451bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid MediaPlayerPrivateQt::positionChanged(qint64)
452dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
453a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    // Only propagate this event if we are seeking
4542bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (m_isSeeking) {
455dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_isSeeking = false;
4562bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_webCorePlayer->timeChanged();
457dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
458dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
459dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
460bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid MediaPlayerPrivateQt::bufferStatusChanged(int)
461f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick{
462f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    notImplemented();
463f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick}
464f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
465bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid MediaPlayerPrivateQt::durationChanged(qint64)
466dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
467bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    m_webCorePlayer->durationChanged();
468dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
469dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
470bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid MediaPlayerPrivateQt::volumeChanged(int volume)
471dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
472bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    m_webCorePlayer->volumeChanged(static_cast<float>(volume) / 100.0);
473dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
474dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
475bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid MediaPlayerPrivateQt::mutedChanged(bool muted)
476dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
477bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    m_webCorePlayer->muteChanged(muted);
478dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
479dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
480bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid MediaPlayerPrivateQt::updateStates()
481dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
482dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Store the old states so that we can detect a change and raise change events
483dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    MediaPlayer::NetworkState oldNetworkState = m_networkState;
484dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    MediaPlayer::ReadyState oldReadyState = m_readyState;
485dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
486dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    QMediaPlayer::MediaStatus currentStatus = m_mediaPlayer->mediaStatus();
487dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    QMediaPlayer::Error currentError = m_mediaPlayer->error();
488dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
489dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (currentError != QMediaPlayer::NoError) {
490dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_readyState = MediaPlayer::HaveNothing;
491dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (currentError == QMediaPlayer::FormatError)
492dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            m_networkState = MediaPlayer::FormatError;
493dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        else
494dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            m_networkState = MediaPlayer::NetworkError;
495dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } else if (currentStatus == QMediaPlayer::UnknownMediaStatus
496dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block               || currentStatus == QMediaPlayer::NoMedia) {
497dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_networkState = MediaPlayer::Idle;
498dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_readyState = MediaPlayer::HaveNothing;
499dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } else if (currentStatus == QMediaPlayer::LoadingMedia) {
500dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_networkState = MediaPlayer::Loading;
501dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_readyState = MediaPlayer::HaveNothing;
502dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } else if (currentStatus == QMediaPlayer::LoadedMedia) {
503dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_networkState = MediaPlayer::Loading;
504dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_readyState = MediaPlayer::HaveMetadata;
505dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } else if (currentStatus == QMediaPlayer::BufferingMedia) {
506dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_networkState = MediaPlayer::Loading;
507dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_readyState = MediaPlayer::HaveFutureData;
508dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } else if (currentStatus == QMediaPlayer::StalledMedia) {
509dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_networkState = MediaPlayer::Loading;
510dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_readyState = MediaPlayer::HaveCurrentData;
511dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } else if (currentStatus == QMediaPlayer::BufferedMedia
512dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block               || currentStatus == QMediaPlayer::EndOfMedia) {
5132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_networkState = MediaPlayer::Loaded;
514dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_readyState = MediaPlayer::HaveEnoughData;
515dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } else if (currentStatus == QMediaPlayer::InvalidMedia) {
516dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_networkState = MediaPlayer::NetworkError;
517dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_readyState = MediaPlayer::HaveNothing;
518dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
519dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
520dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Log the state changes and raise the state change events
521dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // NB: The readyStateChanged event must come before the networkStateChanged event.
522dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Breaking this invariant will cause the resource selection algorithm for multiple
523dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // sources to fail.
524dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (m_readyState != oldReadyState)
525bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        m_webCorePlayer->readyStateChanged();
526dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
527dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (m_networkState != oldNetworkState)
528bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        m_webCorePlayer->networkStateChanged();
529dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
530dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
531bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid MediaPlayerPrivateQt::setSize(const IntSize& size)
532dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
533a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    LOG(Media, "MediaPlayerPrivateQt::setSize(%dx%d)",
534a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            size.width(), size.height());
535a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
536dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (size == m_currentSize)
537dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return;
538dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
539dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_currentSize = size;
540dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_videoItem->setSize(QSizeF(QSize(size)));
541dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
542dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
543bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenIntSize MediaPlayerPrivateQt::naturalSize() const
544dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
545a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (!hasVideo() ||  m_readyState < MediaPlayer::HaveMetadata) {
546a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        LOG(Media, "MediaPlayerPrivateQt::naturalSize() -> 0x0 (!hasVideo || !haveMetaData)");
547dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return IntSize();
548a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    }
549dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
550a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    LOG(Media, "MediaPlayerPrivateQt::naturalSize() -> %dx%d (m_naturalSize)",
551a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            m_naturalSize.width(), m_naturalSize.height());
552a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
553a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    return m_naturalSize;
554dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
555dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
55665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid MediaPlayerPrivateQt::removeVideoItem()
55765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
55865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_oldNaturalSize = m_naturalSize;
55965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_mediaPlayer->setVideoOutput(static_cast<QGraphicsVideoItem*>(0));
56065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_videoScene->removeItem(m_videoItem);
56165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
56265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
56365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid MediaPlayerPrivateQt::restoreVideoItem()
56465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
56565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_mediaPlayer->setVideoOutput(m_videoItem);
56665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_videoScene->addItem(m_videoItem);
56765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // FIXME: a qtmobility bug, need to reset the size when restore the videoitem, otherwise the size is 0
56865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // http://bugreports.qt.nokia.com/browse/QTMOBILITY-971
56965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    nativeSizeChanged(QSize(m_oldNaturalSize));
57065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
57165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
572bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid MediaPlayerPrivateQt::paint(GraphicsContext* context, const IntRect& rect)
573dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
574dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#if USE(ACCELERATED_COMPOSITING)
575dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (m_composited)
576dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return;
577dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
578dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (context->paintingDisabled())
579dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return;
580dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
581dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!m_isVisible)
582dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return;
583dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
584dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    QPainter* painter = context->platformContext();
585dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_videoScene->render(painter, QRectF(QRect(rect)), m_videoItem->sceneBoundingRect());
586dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
587dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
5882fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid MediaPlayerPrivateQt::paintCurrentFrameInContext(GraphicsContext* context, const IntRect& rect)
5892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
5902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (context->paintingDisabled())
5912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
5922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
5932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!m_isVisible)
5942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
5952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
5962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // Grab the painter and widget
5972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    QPainter* painter = context->platformContext();
5982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
5992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // Render the video, using the item as it might not be in the scene
6002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_videoItem->paint(painter, 0, 0);
6012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
6022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
603bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid MediaPlayerPrivateQt::repaint()
604dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
605bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    m_webCorePlayer->repaint();
606dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
607dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
608a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#if USE(ACCELERATED_COMPOSITING) && USE(TEXTURE_MAPPER)
609a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
6102bde8e466a4451c7319e3a072d118917957d6554Steve Blockclass TextureMapperVideoLayerQt : public virtual TextureMapperMediaLayer {
611a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochpublic:
612a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    TextureMapperVideoLayerQt(QGraphicsVideoItem* videoItem)
613a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        : m_videoItem(videoItem)
614a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    {
615a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    }
616a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
617a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    virtual void setPlatformLayerClient(TextureMapperLayerClient* client)
618a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    {
619a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        m_client = client;
620a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    }
621a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
622a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    virtual void paint(GraphicsContext* context)
623a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    {
624a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (!m_videoItem)
625a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            return;
626a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
627a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        QStyleOptionGraphicsItem opt;
628a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        opt.exposedRect = m_videoItem.data()->sceneBoundingRect();
629a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        opt.rect = opt.exposedRect.toRect();
630a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        m_videoItem.data()->paint(context->platformContext(), &opt);
631a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    }
632a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
633a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    virtual IntSize size() const
634a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    {
635a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return m_videoItem ? IntSize(m_videoItem.data()->size().width(), m_videoItem.data()->size().height()) : IntSize();
636a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    }
637a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
638a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    QWeakPointer<QGraphicsVideoItem> m_videoItem;
639a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    TextureMapperLayerClient* m_client;
640a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch};
641a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
642a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
643bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid MediaPlayerPrivateQt::acceleratedRenderingStateChanged()
644dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
645bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    MediaPlayerClient* client = m_webCorePlayer->mediaPlayerClient();
646bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    bool composited = client->mediaPlayerRenderingCanBeAccelerated(m_webCorePlayer);
647dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (composited == m_composited)
648dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return;
649dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
650dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_composited = composited;
651dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (composited)
652a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        m_platformLayer = new TextureMapperVideoLayerQt(m_videoItem);
653dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
654dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
655bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenPlatformLayer* MediaPlayerPrivateQt::platformLayer() const
656dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
657a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    return m_composited ? m_platformLayer.get() : 0;
658dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
659dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
660dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
661bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenPlatformMedia MediaPlayerPrivateQt::platformMedia() const
6625abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
6635abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    PlatformMedia pm;
6645abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    pm.type = PlatformMedia::QtMediaPlayerType;
665bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    pm.media.qtMediaPlayer = const_cast<MediaPlayerPrivateQt*>(this);
6665abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    return pm;
6675abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
6685abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
669dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} // namespace WebCore
670dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
671dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "moc_MediaPlayerPrivateQt.cpp"
672