MediaPlayerPrivateQt.cpp revision 2bde8e466a4451c7319e3a072d118917957d6554
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
87e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    if (QMediaPlayer::hasSupport(mime, QStringList(codec)) >= QtMultimediaKit::ProbablySupported)
88dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return MediaPlayer::IsSupported;
89dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
90dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return MediaPlayer::MayBeSupported;
91dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
92dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
93bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenMediaPlayerPrivateQt::MediaPlayerPrivateQt(MediaPlayer* player)
94bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    : m_webCorePlayer(player)
95dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    , m_mediaPlayer(new QMediaPlayer)
96dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    , m_mediaPlayerControl(0)
97dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    , m_videoItem(new QGraphicsVideoItem)
98dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    , m_videoScene(new QGraphicsScene)
99dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    , m_networkState(MediaPlayer::Empty)
100dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    , m_readyState(MediaPlayer::HaveNothing)
101a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    , m_currentSize(0, 0)
102a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    , m_naturalSize(RenderVideo::defaultSize())
103dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    , m_isVisible(false)
104dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    , m_isSeeking(false)
105dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    , m_composited(false)
106f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    , m_preload(MediaPlayer::Auto)
10781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    , m_suppressNextPlaybackChanged(false)
108dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
10965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_mediaPlayer->setVideoOutput(m_videoItem);
110dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_videoScene->addItem(m_videoItem);
111dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
112dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Signal Handlers
113dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    connect(m_mediaPlayer, SIGNAL(mediaStatusChanged(QMediaPlayer::MediaStatus)),
114dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            this, SLOT(mediaStatusChanged(QMediaPlayer::MediaStatus)));
115dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    connect(m_mediaPlayer, SIGNAL(stateChanged(QMediaPlayer::State)),
116dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            this, SLOT(stateChanged(QMediaPlayer::State)));
117dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    connect(m_mediaPlayer, SIGNAL(error(QMediaPlayer::Error)),
118dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            this, SLOT(handleError(QMediaPlayer::Error)));
119f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    connect(m_mediaPlayer, SIGNAL(bufferStatusChanged(int)),
120f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            this, SLOT(bufferStatusChanged(int)));
121dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    connect(m_mediaPlayer, SIGNAL(durationChanged(qint64)),
122dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            this, SLOT(durationChanged(qint64)));
123dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    connect(m_mediaPlayer, SIGNAL(positionChanged(qint64)),
124dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            this, SLOT(positionChanged(qint64)));
125dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    connect(m_mediaPlayer, SIGNAL(volumeChanged(int)),
126dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            this, SLOT(volumeChanged(int)));
127dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    connect(m_mediaPlayer, SIGNAL(mutedChanged(bool)),
128dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            this, SLOT(mutedChanged(bool)));
129dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    connect(m_videoScene, SIGNAL(changed(QList<QRectF>)),
130dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            this, SLOT(repaint()));
131dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    connect(m_videoItem, SIGNAL(nativeSizeChanged(QSizeF)),
132dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block           this, SLOT(nativeSizeChanged(QSizeF)));
133dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
134dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Grab the player control
135a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (QMediaService* service = m_mediaPlayer->service()) {
136dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_mediaPlayerControl = qobject_cast<QMediaPlayerControl *>(
137e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke                service->requestControl(QMediaPlayerControl_iid));
138dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
139dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
140dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
141bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenMediaPlayerPrivateQt::~MediaPlayerPrivateQt()
142dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
143a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    m_mediaPlayer->disconnect(this);
144a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    m_mediaPlayer->stop();
145a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    m_mediaPlayer->setMedia(QMediaContent());
146a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
147dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    delete m_mediaPlayer;
148dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    delete m_videoScene;
149dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
150dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
151bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenbool MediaPlayerPrivateQt::hasVideo() const
152dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
153dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return m_mediaPlayer->isVideoAvailable();
154dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
155dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
156bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenbool MediaPlayerPrivateQt::hasAudio() const
157dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
158dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return true;
159dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
160dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
161bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid MediaPlayerPrivateQt::load(const String& url)
162dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
163f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    m_mediaUrl = url;
164f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
165f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    // QtMultimedia does not have an API to throttle loading
166f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    // so we handle this ourselves by delaying the load
167f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    if (m_preload == MediaPlayer::None) {
168f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        m_delayingLoad = true;
169f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        return;
170f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    }
171f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
172f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    commitLoad(url);
173f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick}
174f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
175bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid MediaPlayerPrivateQt::commitLoad(const String& url)
176f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick{
177dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // We are now loading
178dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (m_networkState != MediaPlayer::Loading) {
179dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_networkState = MediaPlayer::Loading;
180bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        m_webCorePlayer->networkStateChanged();
181dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
182dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
183dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // And we don't have any data yet
184dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (m_readyState != MediaPlayer::HaveNothing) {
185dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_readyState = MediaPlayer::HaveNothing;
186bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        m_webCorePlayer->readyStateChanged();
187dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
188dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
18981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    KURL kUrl(ParsedURLString, url);
19081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    const QUrl rUrl = kUrl;
191dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    const QString scheme = rUrl.scheme().toLower();
192dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
193dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Grab the client media element
194bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    HTMLMediaElement* element = static_cast<HTMLMediaElement*>(m_webCorePlayer->mediaPlayerClient());
195dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
196dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Construct the media content with a network request if the resource is http[s]
1972bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (scheme == QString::fromLatin1("http") || scheme == QString::fromLatin1("https")) {
198dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        QNetworkRequest request = QNetworkRequest(rUrl);
199dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
200dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // Grab the current document
201dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        Document* document = element->document();
202dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (!document)
203dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            document = element->ownerDocument();
204dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
205dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // Grab the frame and network manager
206dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        Frame* frame = document ? document->frame() : 0;
207ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        FrameLoader* frameLoader = frame ? frame->loader() : 0;
208ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        QNetworkAccessManager* manager = frameLoader ? frameLoader->networkingContext()->networkAccessManager() : 0;
209dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
210ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        if (manager) {
211dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            // Set the cookies
21281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            QNetworkCookieJar* jar = manager->cookieJar();
21381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            QList<QNetworkCookie> cookies = jar->cookiesForUrl(rUrl);
214dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
215dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            // Don't set the header if there are no cookies.
216dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            // This prevents a warning from being emitted.
217dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            if (!cookies.isEmpty())
2182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                request.setHeader(QNetworkRequest::CookieHeader, QVariant::fromValue(cookies));
219dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
220dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            // Set the refferer, but not when requesting insecure content from a secure page
221dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            QUrl documentUrl = QUrl(QString(document->documentURI()));
2222bde8e466a4451c7319e3a072d118917957d6554Steve Block            if (documentUrl.scheme().toLower() == QString::fromLatin1("http") || scheme == QString::fromLatin1("https"))
223dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                request.setRawHeader("Referer", documentUrl.toEncoded());
224dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
225dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            // Set the user agent
226dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            request.setRawHeader("User-Agent", frameLoader->userAgent(rUrl).utf8().data());
227dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
228dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
229dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_mediaPlayer->setMedia(QMediaContent(request));
230dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } else {
231dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // Otherwise, just use the URL
232dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_mediaPlayer->setMedia(QMediaContent(rUrl));
233dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
234dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
235dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Set the current volume and mute status
236dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // We get these from the element, rather than the player, in case we have
237dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // transitioned from a media engine which doesn't support muting, to a media
238dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // engine which does.
239dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_mediaPlayer->setMuted(element->muted());
240dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_mediaPlayer->setVolume(static_cast<int>(element->volume() * 100.0));
241f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
24281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // Don't send PlaybackChanged notification for pre-roll.
24381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_suppressNextPlaybackChanged = true;
24481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
245f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    // Setting a media source will start loading the media, but we need
246f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    // to pre-roll as well to get video size-hints and buffer-status
247f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    if (element->paused())
248f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        m_mediaPlayer->pause();
249f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    else
250f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        m_mediaPlayer->play();
251f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick}
252f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
253bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid MediaPlayerPrivateQt::resumeLoad()
254f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick{
255f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    m_delayingLoad = false;
256f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
257f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    if (!m_mediaUrl.isNull())
258f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        commitLoad(m_mediaUrl);
259dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
260dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
261bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid MediaPlayerPrivateQt::cancelLoad()
262dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
263dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_mediaPlayer->setMedia(QMediaContent());
264dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    updateStates();
265dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
266dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
267bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid MediaPlayerPrivateQt::prepareToPlay()
268f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick{
269f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    if (m_mediaPlayer->media().isNull() || m_delayingLoad)
270f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        resumeLoad();
271f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick}
272f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
273bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid MediaPlayerPrivateQt::play()
274dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
275dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (m_mediaPlayer->state() != QMediaPlayer::PlayingState)
276dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_mediaPlayer->play();
277dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
278dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
279bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid MediaPlayerPrivateQt::pause()
280dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
281dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (m_mediaPlayer->state() == QMediaPlayer::PlayingState)
282dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_mediaPlayer->pause();
283dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
284dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
285bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenbool MediaPlayerPrivateQt::paused() const
286dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
287dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return (m_mediaPlayer->state() != QMediaPlayer::PlayingState);
288dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
289dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
290bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid MediaPlayerPrivateQt::seek(float position)
291dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
292dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!m_mediaPlayer->isSeekable())
293dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return;
294dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
295dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (m_mediaPlayerControl && !m_mediaPlayerControl->availablePlaybackRanges().contains(position * 1000))
296dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return;
297dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
2982bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_isSeeking = true;
2992bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_mediaPlayer->setPosition(static_cast<qint64>(position * 1000));
300dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
301dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
302bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenbool MediaPlayerPrivateQt::seeking() const
303dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
304dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return m_isSeeking;
305dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
306dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
307bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenfloat MediaPlayerPrivateQt::duration() const
308dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
309dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (m_readyState < MediaPlayer::HaveMetadata)
310dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return 0.0f;
311dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
312dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    float duration = m_mediaPlayer->duration() / 1000.0f;
313dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
314dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // We are streaming
315dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (duration <= 0.0f)
316dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        duration = std::numeric_limits<float>::infinity();
317dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
318dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return duration;
319dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
320dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
321bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenfloat MediaPlayerPrivateQt::currentTime() const
322dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
323a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    return m_mediaPlayer->position() / 1000.0f;
324dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
325dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
326bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenPassRefPtr<TimeRanges> MediaPlayerPrivateQt::buffered() const
327dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
328dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    RefPtr<TimeRanges> buffered = TimeRanges::create();
329dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
330dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!m_mediaPlayerControl)
331dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return buffered;
332dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
333dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    QMediaTimeRange playbackRanges = m_mediaPlayerControl->availablePlaybackRanges();
334dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
335dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    foreach (const QMediaTimeInterval interval, playbackRanges.intervals()) {
336dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        float rangeMin = static_cast<float>(interval.start()) / 1000.0f;
337dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        float rangeMax = static_cast<float>(interval.end()) / 1000.0f;
338dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        buffered->add(rangeMin, rangeMax);
339dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
340dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
341dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return buffered.release();
342dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
343dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
344bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenfloat MediaPlayerPrivateQt::maxTimeSeekable() const
345dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
346dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!m_mediaPlayerControl)
347dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return 0;
348dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
349dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return static_cast<float>(m_mediaPlayerControl->availablePlaybackRanges().latestTime()) / 1000.0f;
350dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
351dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
352bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenunsigned MediaPlayerPrivateQt::bytesLoaded() const
353dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
354dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    QLatin1String bytesLoadedKey("bytes-loaded");
355dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (m_mediaPlayer->availableExtendedMetaData().contains(bytesLoadedKey))
356dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return m_mediaPlayer->extendedMetaData(bytesLoadedKey).toInt();
357dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
358f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    return m_mediaPlayer->bufferStatus();
359dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
360dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
361bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenunsigned MediaPlayerPrivateQt::totalBytes() const
362dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
363e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    if (m_mediaPlayer->availableMetaData().contains(QtMultimediaKit::Size))
364e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        return m_mediaPlayer->metaData(QtMultimediaKit::Size).toInt();
365dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
366dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return 100;
367dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
368dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
369bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid MediaPlayerPrivateQt::setPreload(MediaPlayer::Preload preload)
370f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick{
371f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    m_preload = preload;
372f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    if (m_delayingLoad && m_preload != MediaPlayer::None)
373f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        resumeLoad();
374f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick}
375f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
376bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid MediaPlayerPrivateQt::setRate(float rate)
377dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
378dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_mediaPlayer->setPlaybackRate(rate);
379dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
380dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
381bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid MediaPlayerPrivateQt::setVolume(float volume)
382dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
383dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_mediaPlayer->setVolume(static_cast<int>(volume * 100.0));
384dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
385dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
386bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenbool MediaPlayerPrivateQt::supportsMuting() const
387dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
388dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return true;
389dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
390dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
391bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid MediaPlayerPrivateQt::setMuted(bool muted)
392dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
393dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_mediaPlayer->setMuted(muted);
394dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
395dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
396bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenMediaPlayer::NetworkState MediaPlayerPrivateQt::networkState() const
397dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
398dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return m_networkState;
399dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
400dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
401bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenMediaPlayer::ReadyState MediaPlayerPrivateQt::readyState() const
402dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
403dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return m_readyState;
404dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
405dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
406bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid MediaPlayerPrivateQt::setVisible(bool visible)
407dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
408dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_isVisible = visible;
409dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
410dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
411bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid MediaPlayerPrivateQt::mediaStatusChanged(QMediaPlayer::MediaStatus)
412dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
413dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    updateStates();
414dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
415dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
416bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid MediaPlayerPrivateQt::handleError(QMediaPlayer::Error)
417dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
418dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    updateStates();
419dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
420dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
4212bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid MediaPlayerPrivateQt::stateChanged(QMediaPlayer::State)
422dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
42381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (!m_suppressNextPlaybackChanged)
42481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        m_webCorePlayer->playbackStateChanged();
42581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    else
42681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        m_suppressNextPlaybackChanged = false;
427dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
428dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
429a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid MediaPlayerPrivateQt::nativeSizeChanged(const QSizeF& size)
430dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
431a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    LOG(Media, "MediaPlayerPrivateQt::naturalSizeChanged(%dx%d)",
432a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            size.toSize().width(), size.toSize().height());
433a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
434a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (!size.isValid())
435a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return;
436a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
437a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    m_naturalSize = size.toSize();
438bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    m_webCorePlayer->sizeChanged();
439dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
440dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
441bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid MediaPlayerPrivateQt::positionChanged(qint64)
442dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
443a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    // Only propagate this event if we are seeking
4442bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (m_isSeeking) {
445dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_isSeeking = false;
4462bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_webCorePlayer->timeChanged();
447dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
448dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
449dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
450bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid MediaPlayerPrivateQt::bufferStatusChanged(int)
451f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick{
452f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    notImplemented();
453f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick}
454f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
455bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid MediaPlayerPrivateQt::durationChanged(qint64)
456dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
457bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    m_webCorePlayer->durationChanged();
458dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
459dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
460bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid MediaPlayerPrivateQt::volumeChanged(int volume)
461dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
462bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    m_webCorePlayer->volumeChanged(static_cast<float>(volume) / 100.0);
463dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
464dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
465bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid MediaPlayerPrivateQt::mutedChanged(bool muted)
466dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
467bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    m_webCorePlayer->muteChanged(muted);
468dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
469dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
470bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid MediaPlayerPrivateQt::updateStates()
471dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
472dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Store the old states so that we can detect a change and raise change events
473dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    MediaPlayer::NetworkState oldNetworkState = m_networkState;
474dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    MediaPlayer::ReadyState oldReadyState = m_readyState;
475dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
476dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    QMediaPlayer::MediaStatus currentStatus = m_mediaPlayer->mediaStatus();
477dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    QMediaPlayer::Error currentError = m_mediaPlayer->error();
478dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
479dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (currentError != QMediaPlayer::NoError) {
480dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_readyState = MediaPlayer::HaveNothing;
481dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (currentError == QMediaPlayer::FormatError)
482dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            m_networkState = MediaPlayer::FormatError;
483dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        else
484dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            m_networkState = MediaPlayer::NetworkError;
485dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } else if (currentStatus == QMediaPlayer::UnknownMediaStatus
486dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block               || currentStatus == QMediaPlayer::NoMedia) {
487dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_networkState = MediaPlayer::Idle;
488dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_readyState = MediaPlayer::HaveNothing;
489dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } else if (currentStatus == QMediaPlayer::LoadingMedia) {
490dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_networkState = MediaPlayer::Loading;
491dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_readyState = MediaPlayer::HaveNothing;
492dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } else if (currentStatus == QMediaPlayer::LoadedMedia) {
493dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_networkState = MediaPlayer::Loading;
494dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_readyState = MediaPlayer::HaveMetadata;
495dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } else if (currentStatus == QMediaPlayer::BufferingMedia) {
496dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_networkState = MediaPlayer::Loading;
497dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_readyState = MediaPlayer::HaveFutureData;
498dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } else if (currentStatus == QMediaPlayer::StalledMedia) {
499dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_networkState = MediaPlayer::Loading;
500dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_readyState = MediaPlayer::HaveCurrentData;
501dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } else if (currentStatus == QMediaPlayer::BufferedMedia
502dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block               || currentStatus == QMediaPlayer::EndOfMedia) {
5032fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_networkState = MediaPlayer::Loaded;
504dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_readyState = MediaPlayer::HaveEnoughData;
505dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } else if (currentStatus == QMediaPlayer::InvalidMedia) {
506dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_networkState = MediaPlayer::NetworkError;
507dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_readyState = MediaPlayer::HaveNothing;
508dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
509dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
510dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Log the state changes and raise the state change events
511dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // NB: The readyStateChanged event must come before the networkStateChanged event.
512dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Breaking this invariant will cause the resource selection algorithm for multiple
513dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // sources to fail.
514dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (m_readyState != oldReadyState)
515bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        m_webCorePlayer->readyStateChanged();
516dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
517dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (m_networkState != oldNetworkState)
518bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        m_webCorePlayer->networkStateChanged();
519dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
520dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
521bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid MediaPlayerPrivateQt::setSize(const IntSize& size)
522dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
523a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    LOG(Media, "MediaPlayerPrivateQt::setSize(%dx%d)",
524a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            size.width(), size.height());
525a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
526dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (size == m_currentSize)
527dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return;
528dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
529dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_currentSize = size;
530dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_videoItem->setSize(QSizeF(QSize(size)));
531dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
532dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
533bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenIntSize MediaPlayerPrivateQt::naturalSize() const
534dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
535a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (!hasVideo() ||  m_readyState < MediaPlayer::HaveMetadata) {
536a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        LOG(Media, "MediaPlayerPrivateQt::naturalSize() -> 0x0 (!hasVideo || !haveMetaData)");
537dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return IntSize();
538a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    }
539dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
540a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    LOG(Media, "MediaPlayerPrivateQt::naturalSize() -> %dx%d (m_naturalSize)",
541a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            m_naturalSize.width(), m_naturalSize.height());
542a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
543a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    return m_naturalSize;
544dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
545dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
54665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid MediaPlayerPrivateQt::removeVideoItem()
54765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
54865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_oldNaturalSize = m_naturalSize;
54965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_mediaPlayer->setVideoOutput(static_cast<QGraphicsVideoItem*>(0));
55065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_videoScene->removeItem(m_videoItem);
55165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
55265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
55365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid MediaPlayerPrivateQt::restoreVideoItem()
55465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
55565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_mediaPlayer->setVideoOutput(m_videoItem);
55665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_videoScene->addItem(m_videoItem);
55765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // FIXME: a qtmobility bug, need to reset the size when restore the videoitem, otherwise the size is 0
55865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // http://bugreports.qt.nokia.com/browse/QTMOBILITY-971
55965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    nativeSizeChanged(QSize(m_oldNaturalSize));
56065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
56165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
562bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid MediaPlayerPrivateQt::paint(GraphicsContext* context, const IntRect& rect)
563dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
564dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#if USE(ACCELERATED_COMPOSITING)
565dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (m_composited)
566dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return;
567dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
568dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (context->paintingDisabled())
569dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return;
570dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
571dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!m_isVisible)
572dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return;
573dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
574dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    QPainter* painter = context->platformContext();
575dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_videoScene->render(painter, QRectF(QRect(rect)), m_videoItem->sceneBoundingRect());
576dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
577dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
5782fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid MediaPlayerPrivateQt::paintCurrentFrameInContext(GraphicsContext* context, const IntRect& rect)
5792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
5802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (context->paintingDisabled())
5812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
5822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
5832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!m_isVisible)
5842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
5852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
5862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // Grab the painter and widget
5872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    QPainter* painter = context->platformContext();
5882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
5892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // Render the video, using the item as it might not be in the scene
5902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_videoItem->paint(painter, 0, 0);
5912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
5922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
593bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid MediaPlayerPrivateQt::repaint()
594dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
595bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    m_webCorePlayer->repaint();
596dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
597dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
598a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#if USE(ACCELERATED_COMPOSITING) && USE(TEXTURE_MAPPER)
599a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
6002bde8e466a4451c7319e3a072d118917957d6554Steve Blockclass TextureMapperVideoLayerQt : public virtual TextureMapperMediaLayer {
601a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochpublic:
602a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    TextureMapperVideoLayerQt(QGraphicsVideoItem* videoItem)
603a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        : m_videoItem(videoItem)
604a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    {
605a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    }
606a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
607a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    virtual void setPlatformLayerClient(TextureMapperLayerClient* client)
608a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    {
609a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        m_client = client;
610a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    }
611a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
612a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    virtual void paint(GraphicsContext* context)
613a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    {
614a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (!m_videoItem)
615a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            return;
616a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
617a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        QStyleOptionGraphicsItem opt;
618a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        opt.exposedRect = m_videoItem.data()->sceneBoundingRect();
619a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        opt.rect = opt.exposedRect.toRect();
620a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        m_videoItem.data()->paint(context->platformContext(), &opt);
621a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    }
622a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
623a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    virtual IntSize size() const
624a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    {
625a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return m_videoItem ? IntSize(m_videoItem.data()->size().width(), m_videoItem.data()->size().height()) : IntSize();
626a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    }
627a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
628a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    QWeakPointer<QGraphicsVideoItem> m_videoItem;
629a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    TextureMapperLayerClient* m_client;
630a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch};
631a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
632a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
633bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid MediaPlayerPrivateQt::acceleratedRenderingStateChanged()
634dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
635bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    MediaPlayerClient* client = m_webCorePlayer->mediaPlayerClient();
636bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    bool composited = client->mediaPlayerRenderingCanBeAccelerated(m_webCorePlayer);
637dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (composited == m_composited)
638dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return;
639dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
640dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_composited = composited;
641dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (composited)
642a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        m_platformLayer = new TextureMapperVideoLayerQt(m_videoItem);
643dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
644dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
645bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenPlatformLayer* MediaPlayerPrivateQt::platformLayer() const
646dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
647a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    return m_composited ? m_platformLayer.get() : 0;
648dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
649dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
650dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
651bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenPlatformMedia MediaPlayerPrivateQt::platformMedia() const
6525abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
6535abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    PlatformMedia pm;
6545abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    pm.type = PlatformMedia::QtMediaPlayerType;
655bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    pm.media.qtMediaPlayer = const_cast<MediaPlayerPrivateQt*>(this);
6565abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    return pm;
6575abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
6585abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
659dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} // namespace WebCore
660dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
661dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "moc_MediaPlayerPrivateQt.cpp"
662