| OLD | NEW |
| (Empty) |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #ifndef WEBKIT_RENDERER_MEDIA_WEBMEDIAPLAYER_MS_H_ | |
| 6 #define WEBKIT_RENDERER_MEDIA_WEBMEDIAPLAYER_MS_H_ | |
| 7 | |
| 8 #include "base/memory/ref_counted.h" | |
| 9 #include "base/memory/scoped_ptr.h" | |
| 10 #include "base/memory/weak_ptr.h" | |
| 11 #include "base/synchronization/lock.h" | |
| 12 #include "cc/layers/video_frame_provider.h" | |
| 13 #include "media/filters/skcanvas_video_renderer.h" | |
| 14 #include "skia/ext/platform_canvas.h" | |
| 15 #include "third_party/WebKit/public/web/WebMediaPlayer.h" | |
| 16 #include "url/gurl.h" | |
| 17 | |
| 18 namespace WebKit { | |
| 19 class WebFrame; | |
| 20 class WebMediaPlayerClient; | |
| 21 } | |
| 22 | |
| 23 namespace media { | |
| 24 class MediaLog; | |
| 25 } | |
| 26 | |
| 27 namespace webkit { | |
| 28 class WebLayerImpl; | |
| 29 } | |
| 30 | |
| 31 namespace webkit_media { | |
| 32 | |
| 33 class MediaStreamAudioRenderer; | |
| 34 class MediaStreamClient; | |
| 35 class VideoFrameProvider; | |
| 36 class WebMediaPlayerDelegate; | |
| 37 | |
| 38 // WebMediaPlayerMS delegates calls from WebCore::MediaPlayerPrivate to | |
| 39 // Chrome's media player when "src" is from media stream. | |
| 40 // | |
| 41 // WebMediaPlayerMS works with multiple objects, the most important ones are: | |
| 42 // | |
| 43 // VideoFrameProvider | |
| 44 // provides video frames for rendering. | |
| 45 // | |
| 46 // TODO(wjia): add AudioPlayer. | |
| 47 // AudioPlayer | |
| 48 // plays audio streams. | |
| 49 // | |
| 50 // WebKit::WebMediaPlayerClient | |
| 51 // WebKit client of this media player object. | |
| 52 class WebMediaPlayerMS | |
| 53 : public WebKit::WebMediaPlayer, | |
| 54 public cc::VideoFrameProvider, | |
| 55 public base::SupportsWeakPtr<WebMediaPlayerMS> { | |
| 56 public: | |
| 57 // Construct a WebMediaPlayerMS with reference to the client, and | |
| 58 // a MediaStreamClient which provides VideoFrameProvider. | |
| 59 WebMediaPlayerMS(WebKit::WebFrame* frame, | |
| 60 WebKit::WebMediaPlayerClient* client, | |
| 61 base::WeakPtr<WebMediaPlayerDelegate> delegate, | |
| 62 MediaStreamClient* media_stream_client, | |
| 63 media::MediaLog* media_log); | |
| 64 virtual ~WebMediaPlayerMS(); | |
| 65 | |
| 66 virtual void load(const WebKit::WebURL& url, CORSMode cors_mode) OVERRIDE; | |
| 67 virtual void load(const WebKit::WebURL& url, | |
| 68 WebKit::WebMediaSource* media_source, | |
| 69 CORSMode cors_mode) OVERRIDE; | |
| 70 | |
| 71 // Playback controls. | |
| 72 virtual void play() OVERRIDE; | |
| 73 virtual void pause() OVERRIDE; | |
| 74 virtual bool supportsFullscreen() const OVERRIDE; | |
| 75 virtual bool supportsSave() const OVERRIDE; | |
| 76 virtual void seek(double seconds); | |
| 77 virtual void setRate(double rate); | |
| 78 virtual void setVolume(double volume); | |
| 79 virtual void setPreload(WebKit::WebMediaPlayer::Preload preload) OVERRIDE; | |
| 80 virtual const WebKit::WebTimeRanges& buffered() OVERRIDE; | |
| 81 virtual double maxTimeSeekable() const; | |
| 82 | |
| 83 // Methods for painting. | |
| 84 virtual void paint(WebKit::WebCanvas* canvas, | |
| 85 const WebKit::WebRect& rect, | |
| 86 unsigned char alpha) OVERRIDE; | |
| 87 | |
| 88 // True if the loaded media has a playable video/audio track. | |
| 89 virtual bool hasVideo() const OVERRIDE; | |
| 90 virtual bool hasAudio() const OVERRIDE; | |
| 91 | |
| 92 // Dimensions of the video. | |
| 93 virtual WebKit::WebSize naturalSize() const OVERRIDE; | |
| 94 | |
| 95 // Getters of playback state. | |
| 96 virtual bool paused() const OVERRIDE; | |
| 97 virtual bool seeking() const OVERRIDE; | |
| 98 virtual double duration() const; | |
| 99 virtual double currentTime() const; | |
| 100 | |
| 101 // Internal states of loading and network. | |
| 102 virtual WebKit::WebMediaPlayer::NetworkState networkState() const OVERRIDE; | |
| 103 virtual WebKit::WebMediaPlayer::ReadyState readyState() const OVERRIDE; | |
| 104 | |
| 105 virtual bool didLoadingProgress() const OVERRIDE; | |
| 106 | |
| 107 virtual bool hasSingleSecurityOrigin() const OVERRIDE; | |
| 108 virtual bool didPassCORSAccessCheck() const OVERRIDE; | |
| 109 | |
| 110 virtual double mediaTimeForTimeValue(double timeValue) const; | |
| 111 | |
| 112 virtual unsigned decodedFrameCount() const OVERRIDE; | |
| 113 virtual unsigned droppedFrameCount() const OVERRIDE; | |
| 114 virtual unsigned audioDecodedByteCount() const OVERRIDE; | |
| 115 virtual unsigned videoDecodedByteCount() const OVERRIDE; | |
| 116 | |
| 117 // VideoFrameProvider implementation. | |
| 118 virtual void SetVideoFrameProviderClient( | |
| 119 cc::VideoFrameProvider::Client* client) OVERRIDE; | |
| 120 virtual scoped_refptr<media::VideoFrame> GetCurrentFrame() OVERRIDE; | |
| 121 virtual void PutCurrentFrame(const scoped_refptr<media::VideoFrame>& frame) | |
| 122 OVERRIDE; | |
| 123 | |
| 124 private: | |
| 125 // The callback for VideoFrameProvider to signal a new frame is available. | |
| 126 void OnFrameAvailable(const scoped_refptr<media::VideoFrame>& frame); | |
| 127 // Need repaint due to state change. | |
| 128 void RepaintInternal(); | |
| 129 | |
| 130 // The callback for source to report error. | |
| 131 void OnSourceError(); | |
| 132 | |
| 133 // Helpers that set the network/ready state and notifies the client if | |
| 134 // they've changed. | |
| 135 void SetNetworkState(WebKit::WebMediaPlayer::NetworkState state); | |
| 136 void SetReadyState(WebKit::WebMediaPlayer::ReadyState state); | |
| 137 | |
| 138 // Getter method to |client_|. | |
| 139 WebKit::WebMediaPlayerClient* GetClient(); | |
| 140 | |
| 141 WebKit::WebFrame* frame_; | |
| 142 | |
| 143 WebKit::WebMediaPlayer::NetworkState network_state_; | |
| 144 WebKit::WebMediaPlayer::ReadyState ready_state_; | |
| 145 | |
| 146 WebKit::WebTimeRanges buffered_; | |
| 147 | |
| 148 // Used for DCHECKs to ensure methods calls executed in the correct thread. | |
| 149 base::ThreadChecker thread_checker_; | |
| 150 | |
| 151 WebKit::WebMediaPlayerClient* client_; | |
| 152 | |
| 153 base::WeakPtr<WebMediaPlayerDelegate> delegate_; | |
| 154 | |
| 155 MediaStreamClient* media_stream_client_; | |
| 156 scoped_refptr<webkit_media::VideoFrameProvider> video_frame_provider_; | |
| 157 bool paused_; | |
| 158 | |
| 159 // |current_frame_| is updated only on main thread. The object it holds | |
| 160 // can be freed on the compositor thread if it is the last to hold a | |
| 161 // reference but media::VideoFrame is a thread-safe ref-pointer. | |
| 162 scoped_refptr<media::VideoFrame> current_frame_; | |
| 163 // |current_frame_used_| is updated on both main and compositing thread. | |
| 164 // It's used to track whether |current_frame_| was painted for detecting | |
| 165 // when to increase |dropped_frame_count_|. | |
| 166 bool current_frame_used_; | |
| 167 base::Lock current_frame_lock_; | |
| 168 bool pending_repaint_; | |
| 169 | |
| 170 scoped_ptr<webkit::WebLayerImpl> video_weblayer_; | |
| 171 | |
| 172 // A pointer back to the compositor to inform it about state changes. This is | |
| 173 // not NULL while the compositor is actively using this webmediaplayer. | |
| 174 cc::VideoFrameProvider::Client* video_frame_provider_client_; | |
| 175 | |
| 176 bool received_first_frame_; | |
| 177 bool sequence_started_; | |
| 178 base::TimeDelta start_time_; | |
| 179 unsigned total_frame_count_; | |
| 180 unsigned dropped_frame_count_; | |
| 181 media::SkCanvasVideoRenderer video_renderer_; | |
| 182 | |
| 183 scoped_refptr<MediaStreamAudioRenderer> audio_renderer_; | |
| 184 | |
| 185 scoped_refptr<media::MediaLog> media_log_; | |
| 186 | |
| 187 DISALLOW_COPY_AND_ASSIGN(WebMediaPlayerMS); | |
| 188 }; | |
| 189 | |
| 190 } // namespace webkit_media | |
| 191 | |
| 192 #endif // WEBKIT_RENDERER_MEDIA_WEBMEDIAPLAYER_MS_H_ | |
| OLD | NEW |