2 * Copyright (C) 2009 Google Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
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
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.
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.
31 #ifndef WebMediaPlayerClientImpl_h
32 #define WebMediaPlayerClientImpl_h
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>
46 namespace WebCore { class AudioSourceProviderClient; }
50 class WebHelperPluginImpl;
51 class WebAudioSourceProvider;
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
60 , public WebMediaPlayerClient
61 , public WebStreamTextureClient {
64 static bool isEnabled();
65 static void setIsEnabled(bool);
66 static void registerSelf(WebCore::MediaEngineRegistrar);
68 // Returns the encapsulated WebKit::WebMediaPlayer.
69 WebMediaPlayer* mediaPlayer() const;
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();
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;
103 virtual WebCore::PlatformMedia platformMedia() const;
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;
147 #if ENABLE(WEB_AUDIO)
148 virtual WebCore::AudioSourceProvider* audioSourceProvider();
151 #if USE(ACCELERATED_COMPOSITING)
152 virtual bool supportsAcceleratedRendering() const;
154 // WebVideoFrameProvider methods:
155 virtual void setVideoFrameProviderClient(WebVideoFrameProvider::Client*);
156 virtual WebVideoFrame* getCurrentFrame();
157 virtual void putCurrentFrame(WebVideoFrame*);
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);
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;
176 // WebStreamTextureClient methods:
177 virtual void didReceiveFrame();
178 virtual void didUpdateMatrix(const float*);
181 WebMediaPlayerClientImpl();
183 void startDelayedLoad();
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&);
192 static WebCore::MediaPlayer::SupportsType supportsType(
193 const WTF::String& type, const WTF::String& codecs, const WebCore::KURL&);
195 #if USE(ACCELERATED_COMPOSITING)
196 bool acceleratedRenderingInUse();
199 Mutex m_compositingMutex; // Guards m_currentVideoFrame and m_videoFrameProviderClient.
200 WebCore::MediaPlayer* m_mediaPlayer;
201 OwnPtr<WebMediaPlayer> m_webMediaPlayer;
202 WebVideoFrame* m_currentVideoFrame;
205 WebCore::MediaPlayer::Preload m_preload;
206 RefPtr<WebHelperPluginImpl> m_helperPlugin;
207 #if USE(ACCELERATED_COMPOSITING)
208 WebVideoLayer m_videoLayer;
209 bool m_supportsAcceleratedCompositing;
211 WebVideoFrameProvider::Client* m_videoFrameProviderClient;
213 static bool m_isEnabled;
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.
219 class AudioClientImpl : public WebKit::WebAudioSourceProviderClient {
221 AudioClientImpl(WebCore::AudioSourceProviderClient* client)
226 virtual ~AudioClientImpl() { }
228 // WebAudioSourceProviderClient
229 virtual void setFormat(size_t numberOfChannels, float sampleRate);
232 WebCore::AudioSourceProviderClient* m_client;
235 // AudioSourceProviderImpl wraps a WebAudioSourceProvider.
236 // provideInput() calls into Chromium to get a rendered audio stream.
238 class AudioSourceProviderImpl : public WebCore::AudioSourceProvider {
240 AudioSourceProviderImpl()
241 : m_webAudioSourceProvider(0)
245 virtual ~AudioSourceProviderImpl() { }
247 // Wraps the given WebAudioSourceProvider.
248 void wrap(WebAudioSourceProvider*);
250 // WebCore::AudioSourceProvider
251 virtual void setClient(WebCore::AudioSourceProviderClient*);
252 virtual void provideInput(WebCore::AudioBus*, size_t framesToProcess);
255 WebAudioSourceProvider* m_webAudioSourceProvider;
256 OwnPtr<AudioClientImpl> m_client;
259 AudioSourceProviderImpl m_audioSourceProvider;
263 } // namespace WebKit