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