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
28QT_BEGIN_NAMESPACE
29class QMediaPlayerControl;
30class QGraphicsVideoItem;
31class QGraphicsScene;
32QT_END_NAMESPACE
33
34namespace WebCore {
35
36class TextureMapperMediaLayer;
37
38class MediaPlayerPrivateQt : public QObject, public MediaPlayerPrivateInterface {
39
40    Q_OBJECT
41
42public:
43    static MediaPlayerPrivateInterface* create(MediaPlayer* player);
44    ~MediaPlayerPrivateQt();
45
46    static void registerMediaEngine(MediaEngineRegistrar);
47    static void getSupportedTypes(HashSet<String>&);
48    static MediaPlayer::SupportsType supportsType(const String&, const String&);
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
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.
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
106    virtual bool supportsAcceleratedRendering() const { return false; }
107    virtual void acceleratedRenderingStateChanged() { }
108    virtual PlatformLayer* platformLayer() const { return 0; }
109#endif
110#endif
111
112    virtual PlatformMedia platformMedia() const;
113
114    QMediaPlayer* mediaPlayer() const { return m_mediaPlayer; }
115    void removeVideoItem();
116    void restoreVideoItem();
117
118private 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
130private:
131    void updateStates();
132
133private:
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