Move WebMediaPlayerEfl from media to content_renderer
[platform/framework/web/chromium-efl.git] / tizen_src / chromium_impl / content / renderer / media / efl / webmediaplayer_efl.h
1 // Copyright 2015 Samsung Electronics Inc. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef CONTENT_RENDERER_MEDIA_EFL_WEBMEDIAPLAYER_EFL_H_
6 #define CONTENT_RENDERER_MEDIA_EFL_WEBMEDIAPLAYER_EFL_H_
7
8 #include <vector>
9
10 #include "base/message_loop/message_loop.h"
11 #include "base/memory/shared_memory.h"
12 #include "cc/layers/video_frame_provider_client_impl.h"
13 #include "content/renderer/media/efl/media_source_delegate_efl.h"
14 #include "content/renderer/media/efl/renderer_media_player_manager_efl.h"
15 #include "media/base/efl/media_player_efl.h"
16 #include "media/blink/video_frame_compositor.h"
17 #include "media/filters/skcanvas_video_renderer.h"
18 #include "third_party/WebKit/public/platform/WebMediaPlayer.h"
19
20 #if defined(TIZEN_MULTIMEDIA_EME_SUPPORT)
21 #include "media/blink/encrypted_media_player_support.h"
22 #endif
23
24 namespace blink {
25 class WebFrame;
26 class WebMediaPlayerClient;
27 }
28
29 namespace cc_blink {
30 class WebLayerImpl;
31 }
32
33 namespace media {
34 class GpuVideoAcceleratorFactories;
35 class MediaLog;
36 class MediaPlayerEfl;
37 class WebMediaPlayerDelegate;
38 }
39
40 namespace content {
41 class RendererMediaPlayerManager;
42
43 // This class implements blink::WebMediaPlayer by keeping the efl
44 // media player in the browser process. It listens to all the status changes
45 // sent from the browser process and sends playback controls to the media
46 // player.
47 class WebMediaPlayerEfl
48     : public blink::WebMediaPlayer,
49       public cc::VideoFrameProvider,
50       public base::MessageLoop::DestructionObserver,
51       public base::SupportsWeakPtr<WebMediaPlayerEfl> {
52  public:
53   // Construct a WebMediaPlayerEfl object. This class communicates
54   // with the WebMediaPlayerEfl object in the browser process through
55   // |proxy|.
56   WebMediaPlayerEfl(
57       RendererMediaPlayerManager* manager,
58       blink::WebFrame* frame,
59       blink::WebMediaPlayerClient* client,
60       base::WeakPtr<media::WebMediaPlayerDelegate> delegate);
61   ~WebMediaPlayerEfl() override;
62
63   // blink::WebMediaPlayer implementation.
64   void load(LoadType load_type,
65             const blink::WebURL& url,
66             CORSMode cors_mode) override;
67
68   // Playback controls.
69   void play() override;
70   void pause() override;
71   bool supportsSave() const override;
72   void seek(double seconds) override;
73   void setRate(double) override;
74   void setVolume(double) override;
75   blink::WebTimeRanges buffered() const override;
76   blink::WebTimeRanges seekable() const override;
77
78   void paint(blink::WebCanvas*,
79       const blink::WebRect&,
80       unsigned char alpha,
81       SkXfermode::Mode) override;
82
83   // True if the loaded media has a playable video/audio track.
84   bool hasVideo() const override;
85   bool hasAudio() const override;
86
87   // Dimension of the video.
88   blink::WebSize naturalSize() const override;
89
90   // Getters of playback state.
91   bool paused() const override;
92   bool seeking() const override;
93   double duration() const override;
94   double currentTime() const override;
95
96   // Internal states of loading and network.
97   NetworkState networkState() const override;
98   ReadyState readyState() const override;
99
100   bool didLoadingProgress() override;
101
102   bool hasSingleSecurityOrigin() const override;
103   bool didPassCORSAccessCheck() const override;
104
105   double mediaTimeForTimeValue(double timeValue) const override;
106
107   unsigned decodedFrameCount() const override;
108   unsigned droppedFrameCount() const override;
109   unsigned audioDecodedByteCount() const override;
110   unsigned videoDecodedByteCount() const override;
111
112   // cc::VideoFrameProvider implementation.
113   void SetVideoFrameProviderClient(
114       cc::VideoFrameProvider::Client* client) override;
115   scoped_refptr<media::VideoFrame> GetCurrentFrame() override;
116   void PutCurrentFrame(
117       const scoped_refptr<media::VideoFrame>& frame) override {};
118
119   // Method inherited from DestructionObserver.
120   void WillDestroyCurrentMessageLoop() override {};
121 #if defined(TIZEN_MULTIMEDIA_EME_SUPPORT)
122   virtual MediaKeyException generateKeyRequest(
123       const blink::WebString& key_system,
124       const unsigned char* init_data,
125       unsigned init_data_length);
126
127   virtual MediaKeyException addKey(const blink::WebString& key_system,
128                                    const unsigned char* key,
129                                    unsigned key_length,
130                                    const unsigned char* init_data,
131                                    unsigned init_data_length,
132                                    const blink::WebString& session_id);
133
134   virtual MediaKeyException cancelKeyRequest(
135       const blink::WebString& key_system,
136       const blink::WebString& session_id);
137
138   // TODO(jrummell): Remove this method once Blink updated to use the other
139   // method.
140   virtual void setContentDecryptionModule(
141       blink::WebContentDecryptionModule* cdm);
142   virtual void setContentDecryptionModule(
143       blink::WebContentDecryptionModule* cdm,
144       blink::WebContentDecryptionModuleResult result);
145 #endif
146
147   void SetReadyState(WebMediaPlayer::ReadyState state);
148   void SetNetworkState(WebMediaPlayer::NetworkState state);
149
150   void OnNewFrameAvailable(base::SharedMemoryHandle foreign_memory_handle,
151       uint32 length, base::TimeDelta timestamp);
152
153 #if defined(TIZEN_MULTIMEDIA_PIXMAP_SUPPORT)
154   void OnPlatformSurfaceUpdated(int pixmap_id, base::TimeDelta timestamp);
155 #endif
156
157   void OnMediaDataChange(int format, int height, int width, int media);
158   void OnDurationChange(double duration);
159   void OnTimeUpdate(double current_time);
160   void OnBufferUpdate(
161       std::vector<media::MediaPlayerEfl::TimeRanges> buffer_range);
162   void OnTimeChanged();
163   void OnPauseStateChange(bool state);
164   void OnSeekStateChange(bool state);
165   void OnRequestSeek(double seek_time);
166
167   void OnMediaSourceOpened(blink::WebMediaSource* web_media_source);
168   void OnDemuxerSeekDone();
169
170   void RequestPause();
171
172  private:
173   void OnNaturalSizeChanged(gfx::Size size);
174   void OnOpacityChanged(bool opaque);
175
176   // Returns the current video frame from |compositor_|. Blocks until the
177   // compositor can return the frame.
178   scoped_refptr<media::VideoFrame> GetCurrentFrameFromCompositor();
179
180   // Called whenever there is new frame to be painted.
181   void FrameReady(const scoped_refptr<media::VideoFrame>& frame);
182
183   blink::WebFrame* frame_;
184
185   blink::WebMediaPlayer::NetworkState network_state_;
186   blink::WebMediaPlayer::ReadyState ready_state_;
187
188   // Message loops for posting tasks on Chrome's main thread. Also used
189   // for DCHECKs so methods calls won't execute in the wrong thread.
190   const scoped_refptr<base::MessageLoopProxy> main_loop_;
191   scoped_refptr<base::SingleThreadTaskRunner> media_task_runner_;
192
193   // Manager for managing this object and for delegating method calls on
194   // Render Thread.
195   content::RendererMediaPlayerManager* manager_;
196
197   blink::WebMediaPlayerClient* client_;
198
199   scoped_refptr<media::MediaLog> media_log_;
200
201   base::WeakPtr<media::WebMediaPlayerDelegate> delegate_;
202
203   // The compositor layer for displaying the video content when using
204   // composited playback.
205   scoped_ptr<cc_blink::WebLayerImpl> video_weblayer_;
206
207   // Video rendering members.
208   scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner_;
209   media::VideoFrameCompositor* compositor_;
210   media::SkCanvasVideoRenderer skcanvas_video_renderer_;
211
212   base::WeakPtrFactory<WebMediaPlayerEfl> weak_factory_;
213   scoped_ptr<content::MediaSourceDelegateEfl> media_source_delegate_;
214   MediaPlayerHostMsg_Initialize_Type player_type_;
215
216   // Player ID assigned by the |manager_|.
217   int player_id_;
218
219   uint32 gst_video_format_;
220   int gst_width_;
221   int gst_height_;
222
223   bool audio_;
224   bool video_;
225
226   double current_time_;
227   double duration_;
228   bool is_paused_;
229
230   bool is_seeking_;
231   double seek_time_;
232   bool pending_seek_;
233   double pending_seek_time_;
234
235   // Whether the video is known to be opaque or not.
236   bool opaque_;
237
238   gfx::Size natural_size_;
239   blink::WebTimeRanges buffered_;
240   mutable bool did_loading_progress_;
241
242   // Factories for supporting video accelerators. May be null.
243   scoped_refptr<media::GpuVideoAcceleratorFactories> gpu_factories_;
244 #if defined(TIZEN_MULTIMEDIA_EME_SUPPORT)
245   scoped_ptr<media::EncryptedMediaPlayerSupport> encrypted_media_support_;
246 #endif
247
248   DISALLOW_COPY_AND_ASSIGN(WebMediaPlayerEfl);
249 };
250
251 }  // namespace content
252
253 #endif  // CONTENT_RENDERER_MEDIA_EFL_WEBMEDIAPLAYER_EFL_H_