373015eb756af0f4511dae981e6bf2e1b54dd488
[WebKit-https.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 "WebAudioSourceProviderClient.h"
39 #include "WebMediaPlayerClient.h"
40 #include "WebStreamTextureClient.h"
41 #include <public/WebVideoFrameProvider.h>
42 #include <public/WebVideoLayer.h>
43 #include <wtf/OwnPtr.h>
44 #include <wtf/PassOwnPtr.h>
45
46 namespace WebCore { class AudioSourceProviderClient; }
47
48 namespace WebKit {
49
50 class WebHelperPluginImpl;
51 class WebAudioSourceProvider;
52 class WebMediaPlayer;
53
54 // This class serves as a bridge between WebCore::MediaPlayer and
55 // WebKit::WebMediaPlayer.
56 class WebMediaPlayerClientImpl : public WebCore::MediaPlayerPrivateInterface
57 #if USE(ACCELERATED_COMPOSITING)
58                                , public WebVideoFrameProvider
59 #endif
60                                , public WebMediaPlayerClient
61                                , public WebStreamTextureClient {
62
63 public:
64     static bool isEnabled();
65     static void setIsEnabled(bool);
66     static void registerSelf(WebCore::MediaEngineRegistrar);
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 setOpaque(bool);
83     virtual void sawUnsupportedTracks();
84     virtual float volume() const;
85     virtual void playbackStateChanged();
86     virtual WebMediaPlayer::Preload preload() const;
87     virtual void sourceOpened();
88     virtual WebKit::WebURL sourceURL() const;
89     virtual void keyAdded(const WebString& keySystem, const WebString& sessionId);
90     virtual void keyError(const WebString& keySystem, const WebString& sessionId, MediaKeyErrorCode, unsigned short systemCode);
91     virtual void keyMessage(const WebString& keySystem, const WebString& sessionId, const unsigned char* message, unsigned messageLength);
92     virtual void keyNeeded(const WebString& keySystem, const WebString& sessionId, const unsigned char* initData, unsigned initDataLength);
93     virtual WebPlugin* createHelperPlugin(const WebString& pluginType, WebFrame*);
94     virtual void closeHelperPlugin();
95     virtual void disableAcceleratedCompositing();
96
97     // MediaPlayerPrivateInterface methods:
98     virtual void load(const WTF::String& url);
99     virtual void cancelLoad();
100 #if USE(ACCELERATED_COMPOSITING)
101     virtual WebKit::WebLayer* platformLayer() const;
102 #endif
103     virtual WebCore::PlatformMedia platformMedia() const;
104     virtual void play();
105     virtual void pause();
106     virtual void prepareToPlay();
107     virtual bool supportsFullscreen() const;
108     virtual bool supportsSave() const;
109     virtual WebCore::IntSize naturalSize() const;
110     virtual bool hasVideo() const;
111     virtual bool hasAudio() const;
112     virtual void setVisible(bool);
113     virtual float duration() const;
114     virtual float currentTime() const;
115     virtual void seek(float time);
116     virtual bool seeking() const;
117     virtual void setEndTime(float time);
118     virtual void setRate(float);
119     virtual bool paused() const;
120     virtual void setVolume(float);
121     virtual WebCore::MediaPlayer::NetworkState networkState() const;
122     virtual WebCore::MediaPlayer::ReadyState readyState() const;
123     virtual float maxTimeSeekable() const;
124     virtual WTF::PassRefPtr<WebCore::TimeRanges> buffered() const;
125     virtual int dataRate() const;
126     virtual bool totalBytesKnown() const;
127     virtual unsigned totalBytes() const;
128     virtual bool didLoadingProgress() const;
129     virtual void setSize(const WebCore::IntSize&);
130     virtual void paint(WebCore::GraphicsContext*, const WebCore::IntRect&);
131     virtual void paintCurrentFrameInContext(WebCore::GraphicsContext*, const WebCore::IntRect&);
132     virtual void setPreload(WebCore::MediaPlayer::Preload);
133     virtual bool hasSingleSecurityOrigin() const;
134     virtual bool didPassCORSAccessCheck() const;
135     virtual WebCore::MediaPlayer::MovieLoadType movieLoadType() const;
136     virtual float mediaTimeForTimeValue(float timeValue) const;
137     virtual unsigned decodedFrameCount() const;
138     virtual unsigned droppedFrameCount() const;
139     virtual unsigned audioDecodedByteCount() const;
140     virtual unsigned videoDecodedByteCount() const;
141 #if USE(NATIVE_FULLSCREEN_VIDEO)
142     virtual void enterFullscreen();
143     virtual void exitFullscreen();
144     virtual bool canEnterFullscreen() const;
145 #endif
146
147 #if ENABLE(WEB_AUDIO)
148     virtual WebCore::AudioSourceProvider* audioSourceProvider();
149 #endif
150
151 #if USE(ACCELERATED_COMPOSITING)
152     virtual bool supportsAcceleratedRendering() const;
153
154     // WebVideoFrameProvider methods:
155     virtual void setVideoFrameProviderClient(WebVideoFrameProvider::Client*);
156     virtual WebVideoFrame* getCurrentFrame();
157     virtual void putCurrentFrame(WebVideoFrame*);
158 #endif
159
160 #if ENABLE(MEDIA_SOURCE)
161     virtual WebCore::MediaPlayer::AddIdStatus sourceAddId(const String& id, const String& type, const Vector<String>& codecs);
162     virtual bool sourceRemoveId(const String&);
163     virtual WTF::PassRefPtr<WebCore::TimeRanges> sourceBuffered(const String&);
164     virtual bool sourceAppend(const String&, const unsigned char* data, unsigned length);
165     virtual bool sourceAbort(const String&);
166     virtual void sourceEndOfStream(WebCore::MediaPlayer::EndOfStreamStatus);
167     virtual bool sourceSetTimestampOffset(const String&, double offset);
168 #endif
169
170 #if ENABLE(ENCRYPTED_MEDIA)
171     virtual WebCore::MediaPlayer::MediaKeyException generateKeyRequest(const String& keySystem, const unsigned char* initData, unsigned initDataLength) OVERRIDE;
172     virtual WebCore::MediaPlayer::MediaKeyException addKey(const String& keySystem, const unsigned char* key, unsigned keyLength, const unsigned char* initData, unsigned initDataLength, const String& sessionId) OVERRIDE;
173     virtual WebCore::MediaPlayer::MediaKeyException cancelKeyRequest(const String& keySystem, const String& sessionId) OVERRIDE;
174 #endif
175
176     // WebStreamTextureClient methods:
177     virtual void didReceiveFrame();
178     virtual void didUpdateMatrix(const float*);
179
180 protected:
181     WebMediaPlayerClientImpl();
182 private:
183     void startDelayedLoad();
184     void loadInternal();
185
186     static PassOwnPtr<WebCore::MediaPlayerPrivateInterface> create(WebCore::MediaPlayer*);
187     static void getSupportedTypes(WTF::HashSet<WTF::String>&);
188 #if ENABLE(ENCRYPTED_MEDIA)
189     static WebCore::MediaPlayer::SupportsType supportsType(
190         const WTF::String& type, const WTF::String& codecs, const String& keySystem, const WebCore::KURL&);
191 #else
192     static WebCore::MediaPlayer::SupportsType supportsType(
193         const WTF::String& type, const WTF::String& codecs, const WebCore::KURL&);
194 #endif
195 #if USE(ACCELERATED_COMPOSITING)
196     bool acceleratedRenderingInUse();
197 #endif
198
199     Mutex m_compositingMutex; // Guards m_currentVideoFrame and m_videoFrameProviderClient.
200     WebCore::MediaPlayer* m_mediaPlayer;
201     OwnPtr<WebMediaPlayer> m_webMediaPlayer;
202     WebVideoFrame* m_currentVideoFrame;
203     String m_url;
204     bool m_delayingLoad;
205     WebCore::MediaPlayer::Preload m_preload;
206     RefPtr<WebHelperPluginImpl> m_helperPlugin;
207 #if USE(ACCELERATED_COMPOSITING)
208     WebVideoLayer m_videoLayer;
209     bool m_supportsAcceleratedCompositing;
210     bool m_opaque;
211     WebVideoFrameProvider::Client* m_videoFrameProviderClient;
212 #endif
213     static bool m_isEnabled;
214
215 #if ENABLE(WEB_AUDIO)
216     // AudioClientImpl wraps an AudioSourceProviderClient.
217     // When the audio format is known, Chromium calls setFormat() which then dispatches into WebCore.
218
219     class AudioClientImpl : public WebKit::WebAudioSourceProviderClient {
220     public:
221         AudioClientImpl(WebCore::AudioSourceProviderClient* client)
222             : m_client(client)
223         {
224         }
225
226         virtual ~AudioClientImpl() { }
227
228         // WebAudioSourceProviderClient
229         virtual void setFormat(size_t numberOfChannels, float sampleRate);
230
231     private:
232         WebCore::AudioSourceProviderClient* m_client;
233     };
234
235     // AudioSourceProviderImpl wraps a WebAudioSourceProvider.
236     // provideInput() calls into Chromium to get a rendered audio stream.
237
238     class AudioSourceProviderImpl : public WebCore::AudioSourceProvider {
239     public:
240         AudioSourceProviderImpl()
241             : m_webAudioSourceProvider(0)
242         {
243         }
244
245         virtual ~AudioSourceProviderImpl() { }
246
247         // Wraps the given WebAudioSourceProvider.
248         void wrap(WebAudioSourceProvider*);
249
250         // WebCore::AudioSourceProvider
251         virtual void setClient(WebCore::AudioSourceProviderClient*);
252         virtual void provideInput(WebCore::AudioBus*, size_t framesToProcess);
253
254     private:
255         WebAudioSourceProvider* m_webAudioSourceProvider;
256         OwnPtr<AudioClientImpl> m_client;
257     };
258
259     AudioSourceProviderImpl m_audioSourceProvider;
260 #endif
261 };
262
263 } // namespace WebKit
264
265 #endif
266
267 #endif