Home | History | Annotate | Download | only in media
      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 CONTENT_RENDERER_MEDIA_WEBMEDIAPLAYER_MS_H_
      6 #define CONTENT_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 "base/threading/thread_checker.h"
     13 #include "cc/layers/video_frame_provider.h"
     14 #include "media/filters/skcanvas_video_renderer.h"
     15 #include "skia/ext/platform_canvas.h"
     16 #include "third_party/WebKit/public/platform/WebMediaPlayer.h"
     17 #include "url/gurl.h"
     18 
     19 namespace blink {
     20 class WebFrame;
     21 class WebMediaPlayerClient;
     22 }
     23 
     24 namespace media {
     25 class MediaLog;
     26 class WebMediaPlayerDelegate;
     27 }
     28 
     29 namespace cc_blink {
     30 class WebLayerImpl;
     31 }
     32 
     33 namespace content {
     34 class MediaStreamAudioRenderer;
     35 class MediaStreamRendererFactory;
     36 class VideoFrameProvider;
     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 // blink::WebMediaPlayerClient
     51 //   WebKit client of this media player object.
     52 class WebMediaPlayerMS
     53     : public blink::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(blink::WebFrame* frame,
     60                    blink::WebMediaPlayerClient* client,
     61                    base::WeakPtr<media::WebMediaPlayerDelegate> delegate,
     62                    media::MediaLog* media_log,
     63                    scoped_ptr<MediaStreamRendererFactory> factory);
     64   virtual ~WebMediaPlayerMS();
     65 
     66   virtual void load(LoadType load_type,
     67                     const blink::WebURL& url,
     68                     CORSMode cors_mode);
     69 
     70   // Playback controls.
     71   virtual void play();
     72   virtual void pause();
     73   virtual bool supportsSave() const;
     74   virtual void seek(double seconds);
     75   virtual void setRate(double rate);
     76   virtual void setVolume(double volume);
     77   virtual void setPreload(blink::WebMediaPlayer::Preload preload);
     78   virtual blink::WebTimeRanges buffered() const;
     79   virtual double maxTimeSeekable() const;
     80 
     81   // Methods for painting.
     82   virtual void paint(blink::WebCanvas* canvas,
     83                      const blink::WebRect& rect,
     84                      unsigned char alpha,
     85                      SkXfermode::Mode mode);
     86   // TODO(dshwang): remove it because above method replaces. crbug.com/401027
     87   virtual void paint(blink::WebCanvas* canvas,
     88                      const blink::WebRect& rect,
     89                      unsigned char alpha);
     90 
     91   // True if the loaded media has a playable video/audio track.
     92   virtual bool hasVideo() const;
     93   virtual bool hasAudio() const;
     94 
     95   // Dimensions of the video.
     96   virtual blink::WebSize naturalSize() const;
     97 
     98   // Getters of playback state.
     99   virtual bool paused() const;
    100   virtual bool seeking() const;
    101   virtual double duration() const;
    102   virtual double currentTime() const;
    103 
    104   // Internal states of loading and network.
    105   virtual blink::WebMediaPlayer::NetworkState networkState() const;
    106   virtual blink::WebMediaPlayer::ReadyState readyState() const;
    107 
    108   virtual bool didLoadingProgress();
    109 
    110   virtual bool hasSingleSecurityOrigin() const;
    111   virtual bool didPassCORSAccessCheck() const;
    112 
    113   virtual double mediaTimeForTimeValue(double timeValue) const;
    114 
    115   virtual unsigned decodedFrameCount() const;
    116   virtual unsigned droppedFrameCount() const;
    117   virtual unsigned audioDecodedByteCount() const;
    118   virtual unsigned videoDecodedByteCount() const;
    119 
    120   // VideoFrameProvider implementation.
    121   virtual void SetVideoFrameProviderClient(
    122       cc::VideoFrameProvider::Client* client) OVERRIDE;
    123   virtual scoped_refptr<media::VideoFrame> GetCurrentFrame() OVERRIDE;
    124   virtual void PutCurrentFrame(const scoped_refptr<media::VideoFrame>& frame)
    125       OVERRIDE;
    126 
    127  private:
    128   // The callback for VideoFrameProvider to signal a new frame is available.
    129   void OnFrameAvailable(const scoped_refptr<media::VideoFrame>& frame);
    130   // Need repaint due to state change.
    131   void RepaintInternal();
    132 
    133   // The callback for source to report error.
    134   void OnSourceError();
    135 
    136   // Helpers that set the network/ready state and notifies the client if
    137   // they've changed.
    138   void SetNetworkState(blink::WebMediaPlayer::NetworkState state);
    139   void SetReadyState(blink::WebMediaPlayer::ReadyState state);
    140 
    141   // Getter method to |client_|.
    142   blink::WebMediaPlayerClient* GetClient();
    143 
    144   blink::WebFrame* frame_;
    145 
    146   blink::WebMediaPlayer::NetworkState network_state_;
    147   blink::WebMediaPlayer::ReadyState ready_state_;
    148 
    149   blink::WebTimeRanges buffered_;
    150 
    151   float volume_;
    152 
    153   // Used for DCHECKs to ensure methods calls executed in the correct thread.
    154   base::ThreadChecker thread_checker_;
    155 
    156   blink::WebMediaPlayerClient* client_;
    157 
    158   base::WeakPtr<media::WebMediaPlayerDelegate> delegate_;
    159 
    160   // Specify content:: to disambiguate from cc::.
    161   scoped_refptr<content::VideoFrameProvider> video_frame_provider_;
    162   bool paused_;
    163 
    164   // |current_frame_| is updated only on main thread. The object it holds
    165   // can be freed on the compositor thread if it is the last to hold a
    166   // reference but media::VideoFrame is a thread-safe ref-pointer. It is
    167   // however read on the compositing thread so locking is required around all
    168   // modifications on the main thread, and all reads on the compositing thread.
    169   scoped_refptr<media::VideoFrame> current_frame_;
    170   // |current_frame_used_| is updated on both main and compositing thread.
    171   // It's used to track whether |current_frame_| was painted for detecting
    172   // when to increase |dropped_frame_count_|.
    173   bool current_frame_used_;
    174   // |current_frame_lock_| protects |current_frame_used_| and |current_frame_|.
    175   base::Lock current_frame_lock_;
    176   bool pending_repaint_;
    177 
    178   scoped_ptr<cc_blink::WebLayerImpl> video_weblayer_;
    179 
    180   // A pointer back to the compositor to inform it about state changes. This is
    181   // not NULL while the compositor is actively using this webmediaplayer.
    182   cc::VideoFrameProvider::Client* video_frame_provider_client_;
    183 
    184   bool received_first_frame_;
    185   base::TimeDelta current_time_;
    186   unsigned total_frame_count_;
    187   unsigned dropped_frame_count_;
    188   media::SkCanvasVideoRenderer video_renderer_;
    189 
    190   scoped_refptr<MediaStreamAudioRenderer> audio_renderer_;
    191 
    192   scoped_refptr<media::MediaLog> media_log_;
    193 
    194   scoped_ptr<MediaStreamRendererFactory> renderer_factory_;
    195 
    196   DISALLOW_COPY_AND_ASSIGN(WebMediaPlayerMS);
    197 };
    198 
    199 }  // namespace content
    200 
    201 #endif  // CONTENT_RENDERER_MEDIA_WEBMEDIAPLAYER_MS_H_
    202