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