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