1 /*
2     Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
3 
4     This library is free software; you can redistribute it and/or
5     modify it under the terms of the GNU Library General Public
6     License as published by the Free Software Foundation; either
7     version 2 of the License, or (at your option) any later version.
8 
9     This library is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12     Library General Public License for more details.
13 
14     You should have received a copy of the GNU Library General Public License
15     along with this library; see the file COPYING.LIB.  If not, write to
16     the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17     Boston, MA 02110-1301, USA.
18 */
19 
20 #ifndef MediaPlayerPrivateQt_h
21 #define MediaPlayerPrivateQt_h
22 
23 #include "MediaPlayerPrivate.h"
24 
25 #include <QMediaPlayer>
26 #include <QObject>
27 
28 QT_BEGIN_NAMESPACE
29 class QMediaPlayerControl;
30 class QGraphicsVideoItem;
31 class QGraphicsScene;
32 QT_END_NAMESPACE
33 
34 namespace WebCore {
35 
36 class TextureMapperMediaLayer;
37 
38 class MediaPlayerPrivateQt : public QObject, public MediaPlayerPrivateInterface {
39 
40     Q_OBJECT
41 
42 public:
43     static PassOwnPtr<MediaPlayerPrivateInterface> create(MediaPlayer*);
44     ~MediaPlayerPrivateQt();
45 
46     static void registerMediaEngine(MediaEngineRegistrar);
47     static void getSupportedTypes(HashSet<String>&);
48     static MediaPlayer::SupportsType supportsType(const String&, const String&);
isAvailable()49     static bool isAvailable() { return true; }
50 
51     bool hasVideo() const;
52     bool hasAudio() const;
53 
54     void load(const String &url);
55     void commitLoad(const String& url);
56     void resumeLoad();
57     void cancelLoad();
58 
59     void play();
60     void pause();
61     void prepareToPlay();
62 
63     bool paused() const;
64     bool seeking() const;
65 
66     float duration() const;
67     float currentTime() const;
68     void seek(float);
69 
70     void setRate(float);
71     void setVolume(float);
72 
73     bool supportsMuting() const;
74     void setMuted(bool);
75 
76     void setPreload(MediaPlayer::Preload);
77 
78     MediaPlayer::NetworkState networkState() const;
79     MediaPlayer::ReadyState readyState() const;
80 
81     PassRefPtr<TimeRanges> buffered() const;
82     float maxTimeSeekable() const;
83     unsigned bytesLoaded() const;
84     unsigned totalBytes() const;
85 
86     void setVisible(bool);
87 
88     IntSize naturalSize() const;
89     void setSize(const IntSize&);
90 
91     void paint(GraphicsContext*, const IntRect&);
92     // reimplemented for canvas drawImage(HTMLVideoElement)
93     void paintCurrentFrameInContext(GraphicsContext*, const IntRect&);
94 
supportsFullscreen()95     bool supportsFullscreen() const { return true; }
96 
97 #if USE(ACCELERATED_COMPOSITING)
98 #if USE(TEXTURE_MAPPER)
99     // whether accelerated rendering is supported by the media engine for the current media.
supportsAcceleratedRendering()100     virtual bool supportsAcceleratedRendering() const { return true; }
101     // called when the rendering system flips the into or out of accelerated rendering mode.
102     virtual void acceleratedRenderingStateChanged();
103     // returns an object that can be directly composited via GraphicsLayerQt (essentially a QGraphicsItem*)
104     virtual PlatformLayer* platformLayer() const;
105 #else
supportsAcceleratedRendering()106     virtual bool supportsAcceleratedRendering() const { return false; }
acceleratedRenderingStateChanged()107     virtual void acceleratedRenderingStateChanged() { }
platformLayer()108     virtual PlatformLayer* platformLayer() const { return 0; }
109 #endif
110 #endif
111 
112     virtual PlatformMedia platformMedia() const;
113 
mediaPlayer()114     QMediaPlayer* mediaPlayer() const { return m_mediaPlayer; }
115     void removeVideoItem();
116     void restoreVideoItem();
117 
118 private slots:
119     void mediaStatusChanged(QMediaPlayer::MediaStatus);
120     void handleError(QMediaPlayer::Error);
121     void stateChanged(QMediaPlayer::State);
122     void nativeSizeChanged(const QSizeF&);
123     void positionChanged(qint64);
124     void durationChanged(qint64);
125     void bufferStatusChanged(int);
126     void volumeChanged(int);
127     void mutedChanged(bool);
128     void repaint();
129 
130 private:
131     void updateStates();
132 
133 private:
134     MediaPlayerPrivateQt(MediaPlayer*);
135 
136     MediaPlayer* m_webCorePlayer;
137     QMediaPlayer* m_mediaPlayer;
138     QMediaPlayerControl* m_mediaPlayerControl;
139     QGraphicsVideoItem* m_videoItem;
140     QGraphicsScene* m_videoScene;
141 #if USE(ACCELERATED_COMPOSITING) && USE(TEXTURE_MAPPER)
142     OwnPtr<TextureMapperMediaLayer> m_platformLayer;
143 #endif
144 
145     mutable MediaPlayer::NetworkState m_networkState;
146     mutable MediaPlayer::ReadyState m_readyState;
147 
148     IntSize m_currentSize;
149     IntSize m_naturalSize;
150     IntSize m_oldNaturalSize;
151     bool m_isVisible;
152     bool m_isSeeking;
153     bool m_composited;
154     MediaPlayer::Preload m_preload;
155     bool m_delayingLoad;
156     String m_mediaUrl;
157     bool m_suppressNextPlaybackChanged;
158 
159 };
160 }
161 
162 #endif // MediaPlayerPrivateQt_h
163