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) 5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#ifndef CONTENT_RENDERER_MEDIA_ANDROID_WEBMEDIAPLAYER_ANDROID_H_ 6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#define CONTENT_RENDERER_MEDIA_ANDROID_WEBMEDIAPLAYER_ANDROID_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <jni.h> 9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <string> 10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <vector> 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/ref_counted.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/memory/weak_ptr.h" 16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/video_frame_provider.h" 1858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "content/common/media/media_player_messages_enums_android.h" 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/renderer/render_frame_observer.h" 20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/renderer/media/android/media_info_loader.h" 21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/renderer/media/android/media_source_delegate.h" 22e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "content/renderer/media/android/stream_texture_factory.h" 237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/renderer/media/crypto/proxy_decryptor.h" 24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "gpu/command_buffer/common/mailbox.h" 25868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "media/base/android/media_player_android.h" 26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "media/base/demuxer_stream.h" 27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "media/base/media_keys.h" 28868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebGraphicsContext3D.h" 29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "third_party/WebKit/public/platform/WebMediaPlayer.h" 30868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebSize.h" 31868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebURL.h" 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/gfx/rect_f.h" 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace base { 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class MessageLoopProxy; 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace blink { 39e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochclass WebContentDecryptionModule; 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class WebFrame; 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class WebURL; 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace gpu { 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct MailboxHolder; 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace media { 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class MediaLog; 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochnamespace content { 53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class RendererCdmManager; 547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass RendererMediaPlayerManager; 55e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochclass WebContentDecryptionModuleImpl; 56f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class WebLayerImpl; 57e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochclass WebMediaPlayerDelegate; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// This class implements blink::WebMediaPlayer by keeping the android 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// media player in the browser process. It listens to all the status changes 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// sent from the browser process and sends playback controls to the media 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// player. 63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class WebMediaPlayerAndroid : public blink::WebMediaPlayer, 64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public cc::VideoFrameProvider, 65d8024ab0a038fddb82e77aed15fe14c253321b56boliu public RenderFrameObserver, 66d8024ab0a038fddb82e77aed15fe14c253321b56boliu public StreamTextureFactoryContextObserver { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Construct a WebMediaPlayerAndroid object. This class communicates with the 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // MediaPlayerAndroid object in the browser process through |proxy|. 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(qinmin): |frame| argument is used to determine whether the current 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // player can enter fullscreen. This logic should probably be moved into 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // blink, so that enterFullscreen() will not be called if another video is 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // already in fullscreen. 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebMediaPlayerAndroid(blink::WebFrame* frame, 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) blink::WebMediaPlayerClient* client, 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::WeakPtr<WebMediaPlayerDelegate> delegate, 77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RendererMediaPlayerManager* player_manager, 78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RendererCdmManager* cdm_manager, 79e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch scoped_refptr<StreamTextureFactory> factory, 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const scoped_refptr<base::MessageLoopProxy>& media_loop, 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) media::MediaLog* media_log); 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~WebMediaPlayerAndroid(); 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // blink::WebMediaPlayer implementation. 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void enterFullscreen(); 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void exitFullscreen(); 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual bool canEnterFullscreen() const; 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Resource loading. 903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) virtual void load(LoadType load_type, 91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebURL& url, 925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CORSMode cors_mode); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Playback controls. 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void play(); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void pause(); 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void seek(double seconds); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool supportsSave() const; 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void setRate(double rate); 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void setVolume(double volume); 101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual blink::WebTimeRanges buffered() const; 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual double maxTimeSeekable() const; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Poster image, as defined in the <video> element. 1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void setPoster(const blink::WebURL& poster) OVERRIDE; 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Methods for painting. 108f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void paint(blink::WebCanvas* canvas, 109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebRect& rect, 11090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) unsigned char alpha); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual bool copyVideoTextureToPlatformTexture( 113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebGraphicsContext3D* web_graphics_context, 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) unsigned int texture, 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) unsigned int level, 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) unsigned int internal_format, 117a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) unsigned int type, 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool premultiply_alpha, 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool flip_y); 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // True if the loaded media has a playable video/audio track. 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool hasVideo() const; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool hasAudio() const; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Dimensions of the video. 126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual blink::WebSize naturalSize() const; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Getters of playback state. 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool paused() const; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool seeking() const; 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual double duration() const; 132010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual double timelineOffset() const; 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual double currentTime() const; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual bool didLoadingProgress(); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Internal states of loading and network. 138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual blink::WebMediaPlayer::NetworkState networkState() const; 139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual blink::WebMediaPlayer::ReadyState readyState() const; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool hasSingleSecurityOrigin() const; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool didPassCORSAccessCheck() const; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual double mediaTimeForTimeValue(double timeValue) const; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Provide statistics. 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual unsigned decodedFrameCount() const; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual unsigned droppedFrameCount() const; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual unsigned audioDecodedByteCount() const; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual unsigned videoDecodedByteCount() const; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // cc::VideoFrameProvider implementation. These methods are running on the 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // compositor thread. 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetVideoFrameProviderClient( 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cc::VideoFrameProvider::Client* client) OVERRIDE; 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual scoped_refptr<media::VideoFrame> GetCurrentFrame() OVERRIDE; 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void PutCurrentFrame(const scoped_refptr<media::VideoFrame>& frame) 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OVERRIDE; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Media player callback handlers. 161d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) void OnMediaMetadataChanged(const base::TimeDelta& duration, int width, 16290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int height, bool success); 16390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void OnPlaybackComplete(); 16490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void OnBufferingUpdate(int percentage); 16568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) void OnSeekRequest(const base::TimeDelta& time_to_seek); 166d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) void OnSeekComplete(const base::TimeDelta& current_time); 16790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void OnMediaError(int error_type); 16890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void OnVideoSizeChanged(int width, int height); 169d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) void OnDurationChanged(const base::TimeDelta& duration); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called to update the current time. 172d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) void OnTimeUpdate(const base::TimeDelta& current_time); 173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Functions called when media player status changes. 175effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void OnConnectedToRemoteDevice(const std::string& remote_playback_message); 1768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) void OnDisconnectedFromRemoteDevice(); 177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void OnDidEnterFullscreen(); 178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void OnDidExitFullscreen(); 1798bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) void OnMediaPlayerPlay(); 1808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) void OnMediaPlayerPause(); 181f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void OnRequestFullscreen(); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 183d8024ab0a038fddb82e77aed15fe14c253321b56boliu // StreamTextureFactoryContextObserver implementation. 184d8024ab0a038fddb82e77aed15fe14c253321b56boliu virtual void ResetStreamTextureProxy() OVERRIDE; 185d8024ab0a038fddb82e77aed15fe14c253321b56boliu 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when the player is released. 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnPlayerReleased(); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // This function is called by the RendererMediaPlayerManager to pause the 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // video and release the media player and surface texture when we switch tabs. 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // However, the actual GlTexture is not released to keep the video screenshot. 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ReleaseMediaResources(); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // RenderFrameObserver implementation. 1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void OnDestruct() OVERRIDE; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(VIDEO_HOLE) 1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Calculate the boundary rectangle of the media player (i.e. location and 1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // size of the video frame). 2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Returns true if the geometry has been changed since the last call. 2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool UpdateBoundaryRectangle(); 2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::RectF GetBoundaryRectangle(); 2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif // defined(VIDEO_HOLE) 205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual MediaKeyException generateKeyRequest( 207f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebString& key_system, 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const unsigned char* init_data, 2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) unsigned init_data_length); 210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual MediaKeyException addKey( 211f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebString& key_system, 212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const unsigned char* key, 213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) unsigned key_length, 214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const unsigned char* init_data, 215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) unsigned init_data_length, 2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const blink::WebString& session_id); 217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual MediaKeyException cancelKeyRequest( 218f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebString& key_system, 2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const blink::WebString& session_id); 220e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch virtual void setContentDecryptionModule( 221e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch blink::WebContentDecryptionModule* cdm); 222868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) void OnKeyAdded(const std::string& session_id); 2247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) void OnKeyError(const std::string& session_id, 225868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) media::MediaKeys::KeyError error_code, 226a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) uint32 system_code); 2277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) void OnKeyMessage(const std::string& session_id, 228eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::vector<uint8>& message, 22946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const GURL& destination_url); 230868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 231f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void OnMediaSourceOpened(blink::WebMediaSource* web_media_source); 2323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) void OnNeedKey(const std::string& type, 234424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const std::vector<uint8>& init_data); 235868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(xhwang): Implement WebMediaPlayer::setContentDecryptionModule(). 2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // See: http://crbug.com/224786 238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected: 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helper method to update the playing state. 241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void UpdatePlayingState(bool is_playing_); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helper methods for posting task for setting states and update WebKit. 244f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void UpdateNetworkState(blink::WebMediaPlayer::NetworkState state); 245f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void UpdateReadyState(blink::WebMediaPlayer::ReadyState state); 2464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) void TryCreateStreamTextureProxyIfNeeded(); 2474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) void DoCreateStreamTexture(); 2484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helper method to reestablish the surface texture peer for android 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // media player. 251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void EstablishSurfaceTexturePeer(); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Requesting whether the surface texture peer needs to be reestablished. 254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void SetNeedsEstablishPeer(bool needs_establish_peer); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 257929504d64b38e05de7355e162311d6791ad6f54dBo Liu void InitializePlayer(const GURL& url, 258929504d64b38e05de7355e162311d6791ad6f54dBo Liu const GURL& first_party_for_cookies, 259929504d64b38e05de7355e162311d6791ad6f54dBo Liu bool allowed_stored_credentials, 260929504d64b38e05de7355e162311d6791ad6f54dBo Liu int demuxer_client_id); 2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void Pause(bool is_media_related_action); 262effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void DrawRemotePlaybackText(const std::string& remote_playback_message); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ReallocateVideoFrame(); 2648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) void SetCurrentFrameInternal(scoped_refptr<media::VideoFrame>& frame); 265929504d64b38e05de7355e162311d6791ad6f54dBo Liu void DidLoadMediaInfo(MediaInfoLoader::Status status, 266929504d64b38e05de7355e162311d6791ad6f54dBo Liu const GURL& redirected_url, 267929504d64b38e05de7355e162311d6791ad6f54dBo Liu const GURL& first_party_for_cookies, 268929504d64b38e05de7355e162311d6791ad6f54dBo Liu bool allow_stored_credentials); 269a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool IsKeySystemSupported(const std::string& key_system); 270f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 271868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Actually do the work for generateKeyRequest/addKey so they can easily 272868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // report results to UMA. 273a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MediaKeyException GenerateKeyRequestInternal(const std::string& key_system, 274a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const unsigned char* init_data, 275a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) unsigned init_data_length); 276a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MediaKeyException AddKeyInternal(const std::string& key_system, 277868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const unsigned char* key, 278868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) unsigned key_length, 279868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const unsigned char* init_data, 280868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) unsigned init_data_length, 281a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::string& session_id); 282a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MediaKeyException CancelKeyRequestInternal(const std::string& key_system, 283a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::string& session_id); 284868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Requests that this object notifies when a decryptor is ready through the 2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // |decryptor_ready_cb| provided. 2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If |decryptor_ready_cb| is null, the existing callback will be fired with 2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // NULL immediately and reset. 2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void SetDecryptorReadyCB(const media::DecryptorReadyCB& decryptor_ready_cb); 2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 291f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebFrame* const frame_; 292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 293f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebMediaPlayerClient* const client_; 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // |delegate_| is used to notify the browser process of the player status, so 2967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // that the browser process can control screen locks. 2977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // TODO(qinmin): Currently android mediaplayer takes care of the screen 2987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // lock. So this is only used for media source. Will apply this to regular 2997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // media tag once http://crbug.com/247892 is fixed. 3007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::WeakPtr<WebMediaPlayerDelegate> delegate_; 3017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Save the list of buffered time ranges. 303f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebTimeRanges buffered_; 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Size of the video. 306f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebSize natural_size_; 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 308eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Size that has been sent to StreamTexture. 309f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebSize cached_stream_texture_size_; 310eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The video frame object used for rendering by the compositor. 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<media::VideoFrame> current_frame_; 3138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) base::Lock current_frame_lock_; 3148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 3158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) base::ThreadChecker main_thread_checker_; 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Message loop for media thread. 3183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const scoped_refptr<base::MessageLoopProxy> media_loop_; 3193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // URL of the media file to be fetched. 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url_; 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Media duration. 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta duration_; 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Flag to remember if we have a trusted duration_ value provided by 327d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // MediaSourceDelegate notifying OnDurationChanged(). In this case, ignore 3287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // any subsequent duration value passed to OnMediaMetadataChange(). 3297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) bool ignore_metadata_duration_change_; 3307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 33168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Seek gets pending if another seek is in progress. Only last pending seek 33268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // will have effect. 33368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) bool pending_seek_; 33468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::TimeDelta pending_seek_time_; 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Internal seek state. 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool seeking_; 33868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::TimeDelta seek_time_; 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether loading has progressed since the last call to didLoadingProgress. 341cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool did_loading_progress_; 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 343cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Manages this object and delegates player calls to the browser process. 344cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Owned by RenderFrameImpl. 345cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RendererMediaPlayerManager* player_manager_; 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 347cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Delegates EME calls to the browser process. Owned by RenderFrameImpl. 348cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // TODO(xhwang): Remove |cdm_manager_| when prefixed EME is deprecated. See 349cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // http://crbug.com/249976 350cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RendererCdmManager* cdm_manager_; 351cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 352cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Player ID assigned by the |player_manager_|. 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int player_id_; 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Current player states. 356f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebMediaPlayer::NetworkState network_state_; 357f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebMediaPlayer::ReadyState ready_state_; 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // GL texture ID allocated to the video. 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int texture_id_; 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 362eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // GL texture mailbox for texture_id_ to provide in the VideoFrame, and sync 363eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // point for when the mailbox was produced. 364eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch gpu::Mailbox texture_mailbox_; 365eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Stream texture ID allocated to the video. 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int stream_id_; 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether the mediaplayer is playing. 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_playing_; 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether media player needs to re-establish the surface texture peer. 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool needs_establish_peer_; 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Whether the video size info is available. 3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool has_size_info_; 3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 378d8024ab0a038fddb82e77aed15fe14c253321b56boliu const scoped_refptr<base::MessageLoopProxy> compositor_loop_; 379d8024ab0a038fddb82e77aed15fe14c253321b56boliu 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Object for allocating stream textures. 381e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch scoped_refptr<StreamTextureFactory> stream_texture_factory_; 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Object for calling back the compositor thread to repaint the video when a 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // frame available. It should be initialized on the compositor thread. 385d8024ab0a038fddb82e77aed15fe14c253321b56boliu // Accessed on main thread and on compositor thread when main thread is 386d8024ab0a038fddb82e77aed15fe14c253321b56boliu // blocked. 387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ScopedStreamTextureProxy stream_texture_proxy_; 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Whether media player needs external surface. 3905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Only used for the VIDEO_HOLE logic. 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool needs_external_surface_; 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // A pointer back to the compositor to inform it about state changes. This is 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // not NULL while the compositor is actively using this webmediaplayer. 395d8024ab0a038fddb82e77aed15fe14c253321b56boliu // Accessed on main thread and on compositor thread when main thread is 396d8024ab0a038fddb82e77aed15fe14c253321b56boliu // blocked. 3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cc::VideoFrameProvider::Client* video_frame_provider_client_; 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 399f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_ptr<WebLayerImpl> video_weblayer_; 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(VIDEO_HOLE) 402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // A rectangle represents the geometry of video frame, when computed last 403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // time. 404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::RectF last_computed_rect_; 4050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 4060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Whether to use the video overlay for all embedded video. 4070529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // True only for testing. 4080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch bool force_use_overlay_embedded_video_; 4095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif // defined(VIDEO_HOLE) 410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 41190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_ptr<MediaSourceDelegate, 41290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) MediaSourceDelegate::Destroyer> media_source_delegate_; 41390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 414d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Internal pending playback state. 415d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Store a playback request that cannot be started immediately. 416d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) bool pending_playback_; 417d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 41858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) MediaPlayerHostMsg_Initialize_Type player_type_; 4197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The current playing time. Because the media player is in the browser 421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // process, it will regularly update the |current_time_| by calling 422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // OnTimeUpdate(). 42390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) double current_time_; 424c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Whether the browser is currently connected to a remote media player. 4268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool is_remote_; 4278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) media::MediaLog* media_log_; 429868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 4307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) scoped_ptr<MediaInfoLoader> info_loader_; 4317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 432868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // The currently selected key system. Empty string means that no key system 433868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // has been selected. 434a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::string current_key_system_; 435868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 436868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Temporary for EME v0.1. In the future the init data type should be passed 437868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // through GenerateKeyRequest() directly from WebKit. 438868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::string init_data_type_; 439868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 4405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Manages decryption keys and decrypts encrypted frames. 4415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<ProxyDecryptor> proxy_decryptor_; 442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 443e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // Non-owned pointer to the CDM. Updated via calls to 444e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // setContentDecryptionModule(). 445e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch WebContentDecryptionModuleImpl* web_cdm_; 446e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 447e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // This is only Used by Clear Key key system implementation, where a renderer 448e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // side CDM will be used. This is similar to WebMediaPlayerImpl. For other key 449e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // systems, a browser side CDM will be used and we set CDM by calling 450cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // player_manager_->SetCdm() directly. 451e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch media::DecryptorReadyCB decryptor_ready_cb_; 452e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 453929504d64b38e05de7355e162311d6791ad6f54dBo Liu // Whether stored credentials are allowed to be passed to the server. 454929504d64b38e05de7355e162311d6791ad6f54dBo Liu bool allow_stored_credentials_; 455929504d64b38e05de7355e162311d6791ad6f54dBo Liu 45623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // NOTE: Weak pointers must be invalidated before all other member variables. 4571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::WeakPtrFactory<WebMediaPlayerAndroid> weak_factory_; 4581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(WebMediaPlayerAndroid); 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 462eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} // namespace content 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 464eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif // CONTENT_RENDERER_MEDIA_ANDROID_WEBMEDIAPLAYER_ANDROID_H_ 465