tizen beta release
[framework/web/webkit-efl.git] / Source / WebKit / chromium / src / WebMediaPlayerClientImpl.h
1 /*
2  * Copyright (C) 2009 Google Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are
6  * met:
7  *
8  *     * Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  *     * Redistributions in binary form must reproduce the above
11  * copyright notice, this list of conditions and the following disclaimer
12  * in the documentation and/or other materials provided with the
13  * distribution.
14  *     * Neither the name of Google Inc. nor the names of its
15  * contributors may be used to endorse or promote products derived from
16  * this software without specific prior written permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29  */
30
31 #ifndef WebMediaPlayerClientImpl_h
32 #define WebMediaPlayerClientImpl_h
33
34 #if ENABLE(VIDEO)
35
36 #include "AudioSourceProvider.h"
37 #include "MediaPlayerPrivate.h"
38 #include "VideoFrameChromium.h"
39 #include "VideoFrameProvider.h"
40 #include "VideoLayerChromium.h"
41 #include "WebAudioSourceProviderClient.h"
42 #include "WebMediaPlayerClient.h"
43 #include <wtf/OwnPtr.h>
44
45 namespace WebCore { class AudioSourceProviderClient; }
46
47 namespace WebKit {
48
49 class WebAudioSourceProvider;
50 class WebMediaElement;
51 class WebMediaPlayer;
52
53 // This class serves as a bridge between WebCore::MediaPlayer and
54 // WebKit::WebMediaPlayer.
55 class WebMediaPlayerClientImpl : public WebCore::MediaPlayerPrivateInterface
56 #if USE(ACCELERATED_COMPOSITING)
57                                , public WebCore::VideoFrameProvider
58 #endif
59                                , public WebMediaPlayerClient {
60
61 public:
62     static bool isEnabled();
63     static void setIsEnabled(bool);
64     static void registerSelf(WebCore::MediaEngineRegistrar);
65
66     static WebMediaPlayerClientImpl* fromMediaElement(const WebMediaElement* element);
67
68     // Returns the encapsulated WebKit::WebMediaPlayer.
69     WebMediaPlayer* mediaPlayer() const;
70
71     // WebMediaPlayerClient methods:
72     virtual ~WebMediaPlayerClientImpl();
73     virtual void networkStateChanged();
74     virtual void readyStateChanged();
75     virtual void volumeChanged(float);
76     virtual void muteChanged(bool);
77     virtual void timeChanged();
78     virtual void repaint();
79     virtual void durationChanged();
80     virtual void rateChanged();
81     virtual void sizeChanged();
82     virtual void sawUnsupportedTracks();
83     virtual float volume() const;
84     virtual void playbackStateChanged();
85     virtual WebMediaPlayer::Preload preload() const;
86     virtual void sourceOpened();
87     virtual WebKit::WebURL sourceURL() const;
88
89     // MediaPlayerPrivateInterface methods:
90     virtual void load(const WTF::String& url);
91     virtual void cancelLoad();
92 #if USE(ACCELERATED_COMPOSITING)
93     virtual WebCore::PlatformLayer* platformLayer() const;
94 #endif
95     virtual WebCore::PlatformMedia platformMedia() const;
96     virtual void play();
97     virtual void pause();
98     virtual void prepareToPlay();
99     virtual bool supportsFullscreen() const;
100     virtual bool supportsSave() const;
101     virtual WebCore::IntSize naturalSize() const;
102     virtual bool hasVideo() const;
103     virtual bool hasAudio() const;
104     virtual void setVisible(bool);
105     virtual float duration() const;
106     virtual float currentTime() const;
107     virtual void seek(float time);
108     virtual bool seeking() const;
109     virtual void setEndTime(float time);
110     virtual void setRate(float);
111     virtual bool paused() const;
112     virtual void setVolume(float);
113     virtual WebCore::MediaPlayer::NetworkState networkState() const;
114     virtual WebCore::MediaPlayer::ReadyState readyState() const;
115     virtual float maxTimeSeekable() const;
116     virtual WTF::PassRefPtr<WebCore::TimeRanges> buffered() const;
117     virtual int dataRate() const;
118     virtual bool totalBytesKnown() const;
119     virtual unsigned totalBytes() const;
120     virtual unsigned bytesLoaded() const;
121     virtual void setSize(const WebCore::IntSize&);
122     virtual void paint(WebCore::GraphicsContext*, const WebCore::IntRect&);
123     virtual void paintCurrentFrameInContext(WebCore::GraphicsContext*, const WebCore::IntRect&);
124     virtual void setPreload(WebCore::MediaPlayer::Preload);
125     virtual bool hasSingleSecurityOrigin() const;
126     virtual WebCore::MediaPlayer::MovieLoadType movieLoadType() const;
127     virtual float mediaTimeForTimeValue(float timeValue) const;
128     virtual unsigned decodedFrameCount() const;
129     virtual unsigned droppedFrameCount() const;
130     virtual unsigned audioDecodedByteCount() const;
131     virtual unsigned videoDecodedByteCount() const;
132     
133 #if ENABLE(WEB_AUDIO)
134     virtual WebCore::AudioSourceProvider* audioSourceProvider();
135 #endif
136
137 #if USE(ACCELERATED_COMPOSITING)
138     virtual bool supportsAcceleratedRendering() const;
139
140     // VideoFrameProvider methods:
141     virtual WebCore::VideoFrameChromium* getCurrentFrame();
142     virtual void putCurrentFrame(WebCore::VideoFrameChromium*);
143 #endif
144
145 #if ENABLE(MEDIA_SOURCE)
146     virtual bool sourceAppend(const unsigned char* data, unsigned length);
147     virtual void sourceEndOfStream(WebCore::MediaPlayer::EndOfStreamStatus);
148 #endif
149
150 private:
151     WebMediaPlayerClientImpl();
152     void startDelayedLoad();
153     void loadInternal();
154
155     static PassOwnPtr<WebCore::MediaPlayerPrivateInterface> create(WebCore::MediaPlayer*);
156     static void getSupportedTypes(WTF::HashSet<WTF::String>&);
157     static WebCore::MediaPlayer::SupportsType supportsType(
158         const WTF::String& type, const WTF::String& codecs);
159 #if USE(ACCELERATED_COMPOSITING)
160     bool acceleratedRenderingInUse();
161 #endif
162
163     WebCore::MediaPlayer* m_mediaPlayer;
164     OwnPtr<WebMediaPlayer> m_webMediaPlayer;
165     OwnPtr<WebCore::VideoFrameChromium> m_currentVideoFrame;
166     String m_url;
167     bool m_delayingLoad;
168     WebCore::MediaPlayer::Preload m_preload;
169 #if USE(ACCELERATED_COMPOSITING)
170     RefPtr<WebCore::VideoLayerChromium> m_videoLayer;
171     bool m_supportsAcceleratedCompositing;
172 #endif
173     static bool m_isEnabled;
174
175 #if ENABLE(WEB_AUDIO)
176     // AudioClientImpl wraps an AudioSourceProviderClient.
177     // When the audio format is known, Chromium calls setFormat() which then dispatches into WebCore.
178
179     class AudioClientImpl : public WebKit::WebAudioSourceProviderClient {
180     public:
181         AudioClientImpl()
182             : m_client(0)
183         {
184         }
185
186         virtual ~AudioClientImpl() { }
187
188         // WebAudioSourceProviderClient
189         virtual void setFormat(size_t numberOfChannels, float sampleRate);
190
191         void wrap(WebCore::AudioSourceProviderClient* client) { m_client = client; }
192         
193     private:
194         WebCore::AudioSourceProviderClient* m_client;
195     };
196
197     // AudioSourceProviderImpl wraps a WebAudioSourceProvider.
198     // provideInput() calls into Chromium to get a rendered audio stream. 
199
200     class AudioSourceProviderImpl : public WebCore::AudioSourceProvider {
201     public:
202         AudioSourceProviderImpl()
203             : m_webAudioSourceProvider(0)
204         {
205         }
206
207         virtual ~AudioSourceProviderImpl() { }
208
209         // Wraps the given WebAudioSourceProvider.
210         void wrap(WebAudioSourceProvider*);
211
212         // WebCore::AudioSourceProvider
213         virtual void setClient(WebCore::AudioSourceProviderClient*);
214         virtual void provideInput(WebCore::AudioBus*, size_t framesToProcess);
215
216     private:
217         WebAudioSourceProvider* m_webAudioSourceProvider;
218         AudioClientImpl m_client;
219     };
220
221     AudioSourceProviderImpl m_audioSourceProvider;
222 #endif
223 };
224
225 } // namespace WebKit
226
227 #endif
228
229 #endif