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 "VideoFrameChromium.h"
39 #include "VideoFrameProvider.h"
40 #include "VideoLayerChromium.h"
41 #include "WebAudioSourceProviderClient.h"
42 #include "WebMediaPlayerClient.h"
43 #include <wtf/OwnPtr.h>
45 namespace WebCore { class AudioSourceProviderClient; }
49 class WebAudioSourceProvider;
50 class WebMediaElement;
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
59 , public WebMediaPlayerClient {
62 static bool isEnabled();
63 static void setIsEnabled(bool);
64 static void registerSelf(WebCore::MediaEngineRegistrar);
66 static WebMediaPlayerClientImpl* fromMediaElement(const WebMediaElement* element);
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 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;
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;
95 virtual WebCore::PlatformMedia platformMedia() const;
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;
133 #if ENABLE(WEB_AUDIO)
134 virtual WebCore::AudioSourceProvider* audioSourceProvider();
137 #if USE(ACCELERATED_COMPOSITING)
138 virtual bool supportsAcceleratedRendering() const;
140 // VideoFrameProvider methods:
141 virtual WebCore::VideoFrameChromium* getCurrentFrame();
142 virtual void putCurrentFrame(WebCore::VideoFrameChromium*);
145 #if ENABLE(MEDIA_SOURCE)
146 virtual bool sourceAppend(const unsigned char* data, unsigned length);
147 virtual void sourceEndOfStream(WebCore::MediaPlayer::EndOfStreamStatus);
151 WebMediaPlayerClientImpl();
152 void startDelayedLoad();
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();
163 WebCore::MediaPlayer* m_mediaPlayer;
164 OwnPtr<WebMediaPlayer> m_webMediaPlayer;
165 OwnPtr<WebCore::VideoFrameChromium> m_currentVideoFrame;
168 WebCore::MediaPlayer::Preload m_preload;
169 #if USE(ACCELERATED_COMPOSITING)
170 RefPtr<WebCore::VideoLayerChromium> m_videoLayer;
171 bool m_supportsAcceleratedCompositing;
173 static bool m_isEnabled;
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.
179 class AudioClientImpl : public WebKit::WebAudioSourceProviderClient {
186 virtual ~AudioClientImpl() { }
188 // WebAudioSourceProviderClient
189 virtual void setFormat(size_t numberOfChannels, float sampleRate);
191 void wrap(WebCore::AudioSourceProviderClient* client) { m_client = client; }
194 WebCore::AudioSourceProviderClient* m_client;
197 // AudioSourceProviderImpl wraps a WebAudioSourceProvider.
198 // provideInput() calls into Chromium to get a rendered audio stream.
200 class AudioSourceProviderImpl : public WebCore::AudioSourceProvider {
202 AudioSourceProviderImpl()
203 : m_webAudioSourceProvider(0)
207 virtual ~AudioSourceProviderImpl() { }
209 // Wraps the given WebAudioSourceProvider.
210 void wrap(WebAudioSourceProvider*);
212 // WebCore::AudioSourceProvider
213 virtual void setClient(WebCore::AudioSourceProviderClient*);
214 virtual void provideInput(WebCore::AudioBus*, size_t framesToProcess);
217 WebAudioSourceProvider* m_webAudioSourceProvider;
218 AudioClientImpl m_client;
221 AudioSourceProviderImpl m_audioSourceProvider;
225 } // namespace WebKit