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