1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Delegate calls from WebCore::MediaPlayerPrivate to Chrome's video player.
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// It contains PipelineImpl which is the actual media player pipeline, it glues
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// the media player pipeline, data source, audio renderer and renderer.
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// PipelineImpl would creates multiple threads and access some public methods
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// of this class, so we need to be extra careful about concurrent access of
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// methods and members.
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// WebMediaPlayerImpl works with multiple objects, the most important ones are:
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// media::PipelineImpl
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   The media playback pipeline.
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// WebVideoRenderer
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   Video renderer object.
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// WebMediaPlayerImpl::Proxy
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   Proxies methods calls from the media pipeline to WebKit.
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// WebKit::WebMediaPlayerClient
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   WebKit client of this media player object.
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The following diagram shows the relationship of these objects:
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   (note: ref-counted reference is marked by a "r".)
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// WebMediaPlayerImpl ------> PipelineImpl
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//    |            ^               | r
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//    |            |               v
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//    |            |        WebVideoRenderer
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//    |            |          ^ r
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//    |            |          |
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//    |      r     |    r     |
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//    .------>   Proxy  <-----.
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//    |
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//    |
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//    v
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// WebMediaPlayerClient
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Notice that Proxy and WebVideoRenderer are referencing each other. This
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// interdependency has to be treated carefully.
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Other issues:
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// During tear down of the whole browser or a tab, the DOM tree may not be
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// destructed nicely, and there will be some dangling media threads trying to
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// the main thread, so we need this class to listen to destruction event of the
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// main thread and cleanup the media threads when the even is received. Also
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// at destruction of this class we will need to unhook it from destruction event
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// list of the main thread.
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef WEBKIT_GLUE_WEBMEDIAPLAYER_IMPL_H_
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define WEBKIT_GLUE_WEBMEDIAPLAYER_IMPL_H_
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/ref_counted.h"
57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h"
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/message_loop.h"
593f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "base/threading/thread.h"
6072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/synchronization/lock.h"
613f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "base/synchronization/waitable_event.h"
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "media/base/filters.h"
6372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "media/base/message_loop_factory.h"
644a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "media/base/pipeline.h"
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "skia/ext/platform_canvas.h"
6672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "third_party/WebKit/Source/WebKit/chromium/public/WebMediaPlayer.h"
6772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "third_party/WebKit/Source/WebKit/chromium/public/WebMediaPlayerClient.h"
6872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/rect.h"
6972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/size.h"
70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "webkit/glue/media/web_data_source.h"
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass GURL;
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsennamespace WebKit {
7521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenclass WebFrame;
7621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
7721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace webkit_glue {
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
80513209b27ff55e2841eac0e4120199c23acce758Ben Murdochclass MediaResourceLoaderBridgeFactory;
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass WebVideoRenderer;
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass WebMediaPlayerImpl : public WebKit::WebMediaPlayer,
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                           public MessageLoop::DestructionObserver {
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // A proxy class that dispatches method calls from the media pipeline to
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // WebKit. Since there are multiple threads in the media pipeline and there's
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // need for the media pipeline to call to WebKit, e.g. repaint requests,
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // initialization events, etc, we have this class to bridge all method calls
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // from the media pipeline on different threads and serialize these calls
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // on the render thread.
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Because of the nature of this object that it works with different threads,
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // it is made ref-counted.
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  class Proxy : public base::RefCountedThreadSafe<Proxy> {
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   public:
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    Proxy(MessageLoop* render_loop,
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          WebMediaPlayerImpl* webmediaplayer);
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    // Methods for Filter -> WebMediaPlayerImpl communication.
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    void Repaint();
101513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    void SetVideoRenderer(scoped_refptr<WebVideoRenderer> video_renderer);
102ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    WebDataSourceBuildObserverHack* GetBuildObserver();
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
10421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    // Methods for WebMediaPlayerImpl -> Filter communication.
105ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    void Paint(SkCanvas* canvas, const gfx::Rect& dest_rect);
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    void SetSize(const gfx::Rect& rect);
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    void Detach();
1083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    void GetCurrentFrame(scoped_refptr<media::VideoFrame>* frame_out);
1093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    void PutCurrentFrame(scoped_refptr<media::VideoFrame> frame);
110513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    bool HasSingleOrigin();
111dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    void AbortDataSources();
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
113513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // Methods for PipelineImpl -> WebMediaPlayerImpl communication.
114ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    void PipelineInitializationCallback(media::PipelineStatus status);
115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    void PipelineSeekCallback(media::PipelineStatus status);
116ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    void PipelineEndedCallback(media::PipelineStatus status);
117ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    void PipelineErrorCallback(media::PipelineStatus error);
118ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    void NetworkEventCallback(media::PipelineStatus status);
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Returns the message loop used by the proxy.
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    MessageLoop* message_loop() { return render_loop_; }
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   private:
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    friend class base::RefCountedThreadSafe<Proxy>;
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    virtual ~Proxy();
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
128ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // Adds a data source to data_sources_.
129ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    void AddDataSource(WebDataSource* data_source);
130ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Invoke |webmediaplayer_| to perform a repaint.
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    void RepaintTask();
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Notify |webmediaplayer_| that initialization has finished.
135ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    void PipelineInitializationTask(media::PipelineStatus status);
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Notify |webmediaplayer_| that a seek has finished.
138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    void PipelineSeekTask(media::PipelineStatus status);
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Notify |webmediaplayer_| that the media has ended.
141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    void PipelineEndedTask(media::PipelineStatus status);
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
143ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // Notify |webmediaplayer_| that a pipeline error has occurred during
144ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // playback.
145ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    void PipelineErrorTask(media::PipelineStatus error);
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Notify |webmediaplayer_| that there's a network event.
148ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    void NetworkEventTask(media::PipelineStatus status);
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // The render message loop where WebKit lives.
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    MessageLoop* render_loop_;
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    WebMediaPlayerImpl* webmediaplayer_;
153dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
154dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    base::Lock data_sources_lock_;
155dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    typedef std::list<scoped_refptr<WebDataSource> > DataSourceList;
156dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    DataSourceList data_sources_;
157ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    scoped_ptr<WebDataSourceBuildObserverHack> build_observer_;
158dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    scoped_refptr<WebVideoRenderer> video_renderer_;
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
16172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    base::Lock lock_;
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int outstanding_repaints_;
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Construct a WebMediaPlayerImpl with reference to the client, and media
166513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // filter collection. By providing the filter collection the implementor can
167513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // provide more specific media filters that does resource loading and
168513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // rendering. |collection| should contain filter factories for:
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // 1. Data source
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // 2. Audio renderer
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // 3. Video renderer (optional)
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // There are some default filters provided by this method:
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // 1. FFmpeg demuxer
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // 2. FFmpeg audio decoder
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // 3. FFmpeg video decoder
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // 4. Video renderer
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // 5. Null audio renderer
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The video renderer provided by this class is using the graphics context
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // provided by WebKit to perform renderering. The simple data source does
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // resource loading by loading the whole resource object into memory. Null
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // audio renderer is a fake audio device that plays silence. Provider of the
183513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // |collection| can override the default filters by adding extra filters to
184513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // |collection| before calling this method.
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
186201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Callers must call |Initialize()| before they can use the object.
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  WebMediaPlayerImpl(WebKit::WebMediaPlayerClient* client,
18872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                     media::FilterCollection* collection,
18972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                     media::MessageLoopFactory* message_loop_factory);
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual ~WebMediaPlayerImpl();
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
192201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Finalizes initialization of the object.
193201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  bool Initialize(
19421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      WebKit::WebFrame* frame,
195201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      bool use_simple_data_source,
196201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      scoped_refptr<WebVideoRenderer> web_video_renderer);
197201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void load(const WebKit::WebURL& url);
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void cancelLoad();
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Playback controls.
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void play();
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void pause();
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool supportsFullscreen() const;
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool supportsSave() const;
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void seek(float seconds);
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void setEndTime(float seconds);
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void setRate(float rate);
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void setVolume(float volume);
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void setVisible(bool visible);
211ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void setPreload(WebKit::WebMediaPlayer::Preload preload);
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool totalBytesKnown();
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual const WebKit::WebTimeRanges& buffered();
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual float maxTimeSeekable() const;
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Methods for painting.
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void setSize(const WebKit::WebSize& size);
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void paint(WebKit::WebCanvas* canvas, const WebKit::WebRect& rect);
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // True if the loaded media has a playable video/audio track.
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool hasVideo() const;
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool hasAudio() const;
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Dimensions of the video.
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual WebKit::WebSize naturalSize() const;
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Getters of playback state.
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool paused() const;
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool seeking() const;
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual float duration() const;
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual float currentTime() const;
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Get rate of loading the resource.
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual int32 dataRate() const;
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Internal states of loading and network.
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(hclam): Ask the pipeline about the state rather than having reading
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // them from members which would cause race conditions.
24021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual WebKit::WebMediaPlayer::NetworkState networkState() const;
24121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual WebKit::WebMediaPlayer::ReadyState readyState() const;
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual unsigned long long bytesLoaded() const;
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual unsigned long long totalBytes() const;
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool hasSingleSecurityOrigin() const;
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual WebKit::WebMediaPlayer::MovieLoadType movieLoadType() const;
248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
249dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual unsigned decodedFrameCount() const;
250dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual unsigned droppedFrameCount() const;
251dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual unsigned audioDecodedByteCount() const;
252dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual unsigned videoDecodedByteCount() const;
253dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
2543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual WebKit::WebVideoFrame* getCurrentFrame();
2553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void putCurrentFrame(WebKit::WebVideoFrame* web_video_frame);
2563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // As we are closing the tab or even the browser, |main_loop_| is destroyed
258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // even before this object gets destructed, so we need to know when
259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |main_loop_| is being destroyed and we can stop posting repaint task
260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // to it.
261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void WillDestroyCurrentMessageLoop();
262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Repaint();
264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
265ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void OnPipelineInitialize(media::PipelineStatus status);
266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
267ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void OnPipelineSeek(media::PipelineStatus status);
268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
269ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void OnPipelineEnded(media::PipelineStatus status);
270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
271ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void OnPipelineError(media::PipelineStatus error);
272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
273ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void OnNetworkEvent(media::PipelineStatus status);
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Helpers that set the network/ready state and notifies the client if
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // they've changed.
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetNetworkState(WebKit::WebMediaPlayer::NetworkState state);
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetReadyState(WebKit::WebMediaPlayer::ReadyState state);
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Destroy resources held.
282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Destroy();
283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Getter method to |client_|.
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  WebKit::WebMediaPlayerClient* GetClient();
286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(hclam): get rid of these members and read from the pipeline directly.
288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  WebKit::WebMediaPlayer::NetworkState network_state_;
289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  WebKit::WebMediaPlayer::ReadyState ready_state_;
290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Keep a list of buffered time ranges.
292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  WebKit::WebTimeRanges buffered_;
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Message loops for posting tasks between Chrome's main thread. Also used
295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // for DCHECKs so methods calls won't execute in the wrong thread.
296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MessageLoop* main_loop_;
297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
298513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // A collection of filters.
29921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  scoped_ptr<media::FilterCollection> filter_collection_;
300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The actual pipeline and the thread it runs on.
3024a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  scoped_refptr<media::Pipeline> pipeline_;
30372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
30472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_ptr<media::MessageLoopFactory> message_loop_factory_;
305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Playback state.
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(scherkus): we have these because Pipeline favours the simplicity of a
309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // single "playback rate" over worrying about paused/stopped etc...  It forces
310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // all clients to manage the pause+playback rate externally, but is that
311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // really a bad thing?
312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(scherkus): since SetPlaybackRate(0) is asynchronous and we don't want
314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // to hang the render thread during pause(), we record the time at the same
315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // time we pause and then return that value in currentTime().  Otherwise our
316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // clock can creep forward a little bit while the asynchronous
317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // SetPlaybackRate(0) is being executed.
318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool paused_;
31921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  bool seeking_;
320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  float playback_rate_;
321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  base::TimeDelta paused_time_;
322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  WebKit::WebMediaPlayerClient* client_;
324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<Proxy> proxy_;
326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if WEBKIT_USING_CG
328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<skia::PlatformCanvas> skia_canvas_;
329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(WebMediaPlayerImpl);
332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace webkit_glue
335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // WEBKIT_GLUE_WEBMEDIAPLAYER_IMPL_H_
337