1868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifndef MEDIA_BLINK_WEBMEDIAPLAYER_IMPL_H_
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define MEDIA_BLINK_WEBMEDIAPLAYER_IMPL_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <vector>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/basictypes.h"
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/compiler_specific.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/threading/thread.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/audio_renderer_sink.h"
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "media/base/media_export.h"
19e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// TODO(xhwang): Remove when we remove prefixed EME implementation.
20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "media/base/media_keys.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/pipeline.h"
2290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "media/base/text_track.h"
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "media/blink/buffered_data_source.h"
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "media/blink/buffered_data_source_host_impl.h"
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "media/blink/video_frame_compositor.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "media/filters/skcanvas_video_renderer.h"
274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "third_party/WebKit/public/platform/WebAudioSourceProvider.h"
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "third_party/WebKit/public/platform/WebContentDecryptionModuleResult.h"
29868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebGraphicsContext3D.h"
30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "third_party/WebKit/public/platform/WebMediaPlayer.h"
31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "third_party/WebKit/public/platform/WebMediaPlayerClient.h"
32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace blink {
350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass WebLocalFrame;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace base {
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass SingleThreadTaskRunner;
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)namespace cc_blink {
4303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)class WebLayerImpl;
4403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
4503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media {
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass AudioHardwareConfig;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ChunkDemuxer;
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass EncryptedMediaPlayerSupport;
503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class GpuVideoAcceleratorFactories;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MediaLog;
52effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass VideoFrameCompositor;
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class WebAudioSourceProviderImpl;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebMediaPlayerDelegate;
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class WebMediaPlayerParams;
5690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class WebTextTrackImpl;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// The canonical implementation of blink::WebMediaPlayer that's backed by
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Pipeline. Handles normal resource loading, Media Source, and
60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Encrypted Media.
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass MEDIA_EXPORT WebMediaPlayerImpl
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : public NON_EXPORTED_BASE(blink::WebMediaPlayer),
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public base::SupportsWeakPtr<WebMediaPlayerImpl> {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Constructs a WebMediaPlayer implementation using Chromium's media stack.
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |delegate| may be null.
67c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  WebMediaPlayerImpl(blink::WebLocalFrame* frame,
68c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                     blink::WebMediaPlayerClient* client,
69c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                     base::WeakPtr<WebMediaPlayerDelegate> delegate,
70c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                     const WebMediaPlayerParams& params);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~WebMediaPlayerImpl();
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual void load(LoadType load_type,
74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    const blink::WebURL& url,
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                    CORSMode cors_mode);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Playback controls.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void play();
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void pause();
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool supportsSave() const;
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void seek(double seconds);
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void setRate(double rate);
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void setVolume(double volume);
84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void setPreload(blink::WebMediaPlayer::Preload preload);
85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual blink::WebTimeRanges buffered() const;
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual double maxTimeSeekable() const;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Methods for painting.
89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void paint(blink::WebCanvas* canvas,
90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                     const blink::WebRect& rect,
9103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                     unsigned char alpha,
9203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                     SkXfermode::Mode mode);
9303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // TODO(dshwang): remove it because above method replaces. crbug.com/401027
9403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  virtual void paint(blink::WebCanvas* canvas,
9503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                     const blink::WebRect& rect,
9690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                     unsigned char alpha);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // True if the loaded media has a playable video/audio track.
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool hasVideo() const;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool hasAudio() const;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Dimensions of the video.
103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual blink::WebSize naturalSize() const;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Getters of playback state.
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool paused() const;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool seeking() const;
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual double duration() const;
1090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  virtual double timelineOffset() const;
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual double currentTime() const;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Internal states of loading and network.
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(hclam): Ask the pipeline about the state rather than having reading
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // them from members which would cause race conditions.
115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual blink::WebMediaPlayer::NetworkState networkState() const;
116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual blink::WebMediaPlayer::ReadyState readyState() const;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual bool didLoadingProgress();
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool hasSingleSecurityOrigin() const;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool didPassCORSAccessCheck() const;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual double mediaTimeForTimeValue(double timeValue) const;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual unsigned decodedFrameCount() const;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual unsigned droppedFrameCount() const;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual unsigned audioDecodedByteCount() const;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual unsigned videoDecodedByteCount() const;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool copyVideoTextureToPlatformTexture(
131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      blink::WebGraphicsContext3D* web_graphics_context,
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      unsigned int texture,
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      unsigned int level,
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      unsigned int internal_format,
135a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      unsigned int type,
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bool premultiply_alpha,
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bool flip_y);
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual blink::WebAudioSourceProvider* audioSourceProvider();
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual MediaKeyException generateKeyRequest(
142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const blink::WebString& key_system,
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const unsigned char* init_data,
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unsigned init_data_length);
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
146f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual MediaKeyException addKey(const blink::WebString& key_system,
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   const unsigned char* key,
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   unsigned key_length,
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   const unsigned char* init_data,
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   unsigned init_data_length,
151f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                   const blink::WebString& session_id);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual MediaKeyException cancelKeyRequest(
154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const blink::WebString& key_system,
155f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const blink::WebString& session_id);
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // TODO(jrummell): Remove this method once Blink updated to use the other
1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // method.
1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void setContentDecryptionModule(
1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      blink::WebContentDecryptionModule* cdm);
1616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual void setContentDecryptionModule(
1626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      blink::WebContentDecryptionModule* cdm,
1636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      blink::WebContentDecryptionModuleResult result);
1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void OnPipelineSeeked(bool time_changed, PipelineStatus status);
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnPipelineEnded();
1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void OnPipelineError(PipelineStatus error);
1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void OnPipelineMetadata(PipelineMetadata metadata);
1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void OnPipelineBufferingStateChanged(BufferingState buffering_state);
1703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void OnDemuxerOpened();
1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void OnAddTextTrack(const TextTrackConfig& config,
1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      const AddTextTrackDoneCB& done_cb);
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
175eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Called after |defer_load_cb_| has decided to allow the load. If
176eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // |defer_load_cb_| is null this is called immediately.
1773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void DoLoad(LoadType load_type,
178f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)              const blink::WebURL& url,
179eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch              CORSMode cors_mode);
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called after asynchronous initialization of a data source completed.
18246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void DataSourceInitialized(bool success);
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called when the data source is downloading or paused.
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void NotifyDownloading(bool is_downloading);
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Creates a Renderer that will be used by the |pipeline_|.
1881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<Renderer> CreateRenderer();
1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Finishes starting the pipeline due to a call to load().
1913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void StartPipeline();
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helpers that set the network/ready state and notifies the client if
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // they've changed.
195f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void SetNetworkState(blink::WebMediaPlayer::NetworkState state);
196f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void SetReadyState(blink::WebMediaPlayer::ReadyState state);
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Gets the duration value reported by the pipeline.
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  double GetPipelineDuration() const;
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Callbacks from |pipeline_| that are forwarded to |client_|.
202a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  void OnDurationChanged();
203a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  void OnNaturalSizeChanged(gfx::Size size);
204a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  void OnOpacityChanged(bool opaque);
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
206f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Called by VideoRendererImpl on its internal thread with the new frame to be
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // painted.
2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void FrameReady(const scoped_refptr<VideoFrame>& frame);
2096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
210010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Returns the current video frame from |compositor_|. Blocks until the
211010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // compositor can return the frame.
2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_refptr<VideoFrame> GetCurrentFrameFromCompositor();
213010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
214c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  blink::WebLocalFrame* frame_;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(hclam): get rid of these members and read from the pipeline directly.
217f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebMediaPlayer::NetworkState network_state_;
218f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebMediaPlayer::ReadyState ready_state_;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Preload state for when |data_source_| is created after setPreload().
2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  BufferedDataSource::Preload preload_;
2226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Task runner for posting tasks on Chrome's main thread. Also used
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // for DCHECKs so methods calls won't execute in the wrong thread.
2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_refptr<base::SingleThreadTaskRunner> media_task_runner_;
2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_refptr<MediaLog> media_log_;
2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Pipeline pipeline_;
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // The LoadType passed in the |load_type| parameter of the load() call.
2323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  LoadType load_type_;
2333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
234effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Cache of metadata for answering hasAudio(), hasVideo(), and naturalSize().
2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  PipelineMetadata pipeline_metadata_;
236effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
237a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Whether the video is known to be opaque or not.
238a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  bool opaque_;
239a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Playback state.
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(scherkus): we have these because Pipeline favours the simplicity of a
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // single "playback rate" over worrying about paused/stopped etc...  It forces
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // all clients to manage the pause+playback rate externally, but is that
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // really a bad thing?
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(scherkus): since SetPlaybackRate(0) is asynchronous and we don't want
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to hang the render thread during pause(), we record the time at the same
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // time we pause and then return that value in currentTime().  Otherwise our
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // clock can creep forward a little bit while the asynchronous
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SetPlaybackRate(0) is being executed.
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool paused_;
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool seeking_;
254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  double playback_rate_;
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeDelta paused_time_;
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // TODO(scherkus): Replace with an explicit ended signal to HTMLMediaElement,
2581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // see http://crbug.com/409280
2591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool ended_;
2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Seek gets pending if another seek is in progress. Only last pending seek
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // will have effect.
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool pending_seek_;
264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  double pending_seek_seconds_;
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
266116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Tracks whether to issue time changed notifications during buffering state
267116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // changes.
268116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool should_notify_time_changed_;
269116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
270f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebMediaPlayerClient* client_;
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WeakPtr<WebMediaPlayerDelegate> delegate_;
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
274eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::Callback<void(const base::Closure&)> defer_load_cb_;
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Factories for supporting video accelerators. May be null.
2771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_refptr<GpuVideoAcceleratorFactories> gpu_factories_;
278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Routes audio playback to either AudioRendererSink or WebAudio.
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<WebAudioSourceProviderImpl> audio_source_provider_;
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool supports_save_;
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // These two are mutually exclusive:
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //   |data_source_| is used for regular resource loads.
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //   |chunk_demuxer_| is used for Media Source resource loads.
287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  //
288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // |demuxer_| will contain the appropriate demuxer based on which resource
289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // load strategy we're using.
290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<BufferedDataSource> data_source_;
2911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<Demuxer> demuxer_;
2921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ChunkDemuxer* chunk_demuxer_;
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
294c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  BufferedDataSourceHostImpl buffered_data_source_host_;
295c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Video rendering members.
297010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner_;
298010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  VideoFrameCompositor* compositor_;  // Deleted on |compositor_task_runner_|.
2991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SkCanvasVideoRenderer skcanvas_video_renderer_;
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The compositor layer for displaying the video content when using composited
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // playback.
30303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  scoped_ptr<cc_blink::WebLayerImpl> video_weblayer_;
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
30590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Text track objects get a unique index value when they're created.
30690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  int text_track_index_;
30790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<EncryptedMediaPlayerSupport> encrypted_media_support_;
3095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const AudioHardwareConfig& audio_hardware_config_;
3115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(WebMediaPlayerImpl);
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace media
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif  // MEDIA_BLINK_WEBMEDIAPLAYER_IMPL_H_
318