Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(398)

Side by Side Diff: content/renderer/media/android/webmediaplayer_android.cc

Issue 295103015: Separate RendererCdmManager from RendererMediaPlayerManager. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase again Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/renderer/media/android/webmediaplayer_android.h" 5 #include "content/renderer/media/android/webmediaplayer_android.h"
6 6
7 #include <limits> 7 #include <limits>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/callback_helpers.h" 10 #include "base/callback_helpers.h"
11 #include "base/command_line.h" 11 #include "base/command_line.h"
12 #include "base/files/file_path.h" 12 #include "base/files/file_path.h"
13 #include "base/logging.h" 13 #include "base/logging.h"
14 #include "base/message_loop/message_loop.h" 14 #include "base/message_loop/message_loop.h"
15 #include "base/metrics/histogram.h" 15 #include "base/metrics/histogram.h"
16 #include "base/strings/string_number_conversions.h" 16 #include "base/strings/string_number_conversions.h"
17 #include "base/strings/utf_string_conversions.h" 17 #include "base/strings/utf_string_conversions.h"
18 #include "cc/layers/video_layer.h" 18 #include "cc/layers/video_layer.h"
19 #include "content/public/common/content_client.h" 19 #include "content/public/common/content_client.h"
20 #include "content/public/common/content_switches.h" 20 #include "content/public/common/content_switches.h"
21 #include "content/public/renderer/render_frame.h" 21 #include "content/public/renderer/render_frame.h"
22 #include "content/renderer/media/android/renderer_demuxer_android.h" 22 #include "content/renderer/media/android/renderer_demuxer_android.h"
23 #include "content/renderer/media/android/renderer_media_player_manager.h" 23 #include "content/renderer/media/android/renderer_media_player_manager.h"
24 #include "content/renderer/media/crypto/key_systems.h" 24 #include "content/renderer/media/crypto/key_systems.h"
25 #include "content/renderer/media/crypto/renderer_cdm_manager.h"
25 #include "content/renderer/media/webcontentdecryptionmodule_impl.h" 26 #include "content/renderer/media/webcontentdecryptionmodule_impl.h"
26 #include "content/renderer/media/webmediaplayer_delegate.h" 27 #include "content/renderer/media/webmediaplayer_delegate.h"
27 #include "content/renderer/media/webmediaplayer_util.h" 28 #include "content/renderer/media/webmediaplayer_util.h"
28 #include "content/renderer/render_frame_impl.h" 29 #include "content/renderer/render_frame_impl.h"
29 #include "content/renderer/render_thread_impl.h" 30 #include "content/renderer/render_thread_impl.h"
30 #include "gpu/GLES2/gl2extchromium.h" 31 #include "gpu/GLES2/gl2extchromium.h"
31 #include "gpu/command_buffer/client/gles2_interface.h" 32 #include "gpu/command_buffer/client/gles2_interface.h"
32 #include "gpu/command_buffer/common/mailbox_holder.h" 33 #include "gpu/command_buffer/common/mailbox_holder.h"
33 #include "media/base/android/media_player_android.h" 34 #include "media/base/android/media_player_android.h"
34 #include "media/base/bind_to_current_loop.h" 35 #include "media/base/bind_to_current_loop.h"
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
78 gl->DeleteTextures(1, &texture_id); 79 gl->DeleteTextures(1, &texture_id);
79 } 80 }
80 } // namespace 81 } // namespace
81 82
82 namespace content { 83 namespace content {
83 84
84 WebMediaPlayerAndroid::WebMediaPlayerAndroid( 85 WebMediaPlayerAndroid::WebMediaPlayerAndroid(
85 blink::WebFrame* frame, 86 blink::WebFrame* frame,
86 blink::WebMediaPlayerClient* client, 87 blink::WebMediaPlayerClient* client,
87 base::WeakPtr<WebMediaPlayerDelegate> delegate, 88 base::WeakPtr<WebMediaPlayerDelegate> delegate,
88 RendererMediaPlayerManager* manager, 89 RendererMediaPlayerManager* player_manager,
90 RendererCdmManager* cdm_manager,
89 scoped_refptr<StreamTextureFactory> factory, 91 scoped_refptr<StreamTextureFactory> factory,
90 const scoped_refptr<base::MessageLoopProxy>& media_loop, 92 const scoped_refptr<base::MessageLoopProxy>& media_loop,
91 media::MediaLog* media_log) 93 media::MediaLog* media_log)
92 : RenderFrameObserver(RenderFrame::FromWebFrame(frame)), 94 : RenderFrameObserver(RenderFrame::FromWebFrame(frame)),
93 frame_(frame), 95 frame_(frame),
94 client_(client), 96 client_(client),
95 delegate_(delegate), 97 delegate_(delegate),
96 buffered_(static_cast<size_t>(1)), 98 buffered_(static_cast<size_t>(1)),
97 media_loop_(media_loop), 99 media_loop_(media_loop),
98 ignore_metadata_duration_change_(false), 100 ignore_metadata_duration_change_(false),
99 pending_seek_(false), 101 pending_seek_(false),
100 seeking_(false), 102 seeking_(false),
101 did_loading_progress_(false), 103 did_loading_progress_(false),
102 manager_(manager), 104 player_manager_(player_manager),
105 cdm_manager_(cdm_manager),
103 network_state_(WebMediaPlayer::NetworkStateEmpty), 106 network_state_(WebMediaPlayer::NetworkStateEmpty),
104 ready_state_(WebMediaPlayer::ReadyStateHaveNothing), 107 ready_state_(WebMediaPlayer::ReadyStateHaveNothing),
105 texture_id_(0), 108 texture_id_(0),
106 stream_id_(0), 109 stream_id_(0),
107 is_playing_(false), 110 is_playing_(false),
108 playing_started_(false), 111 playing_started_(false),
109 needs_establish_peer_(true), 112 needs_establish_peer_(true),
110 stream_texture_proxy_initialized_(false), 113 stream_texture_proxy_initialized_(false),
111 has_size_info_(false), 114 has_size_info_(false),
112 has_media_metadata_(false), 115 has_media_metadata_(false),
113 has_media_info_(false), 116 has_media_info_(false),
114 stream_texture_factory_(factory), 117 stream_texture_factory_(factory),
115 needs_external_surface_(false), 118 needs_external_surface_(false),
116 video_frame_provider_client_(NULL), 119 video_frame_provider_client_(NULL),
117 pending_playback_(false), 120 pending_playback_(false),
118 player_type_(MEDIA_PLAYER_TYPE_URL), 121 player_type_(MEDIA_PLAYER_TYPE_URL),
119 current_time_(0), 122 current_time_(0),
120 is_remote_(false), 123 is_remote_(false),
121 media_log_(media_log), 124 media_log_(media_log),
122 web_cdm_(NULL), 125 web_cdm_(NULL),
123 weak_factory_(this) { 126 weak_factory_(this) {
124 DCHECK(manager_); 127 DCHECK(player_manager_);
128 DCHECK(cdm_manager_);
125 129
126 DCHECK(main_thread_checker_.CalledOnValidThread()); 130 DCHECK(main_thread_checker_.CalledOnValidThread());
127 131
128 player_id_ = manager_->RegisterMediaPlayer(this); 132 player_id_ = player_manager_->RegisterMediaPlayer(this);
129 133
130 #if defined(VIDEO_HOLE) 134 #if defined(VIDEO_HOLE)
131 force_use_overlay_embedded_video_ = CommandLine::ForCurrentProcess()-> 135 force_use_overlay_embedded_video_ = CommandLine::ForCurrentProcess()->
132 HasSwitch(switches::kForceUseOverlayEmbeddedVideo); 136 HasSwitch(switches::kForceUseOverlayEmbeddedVideo);
133 if (force_use_overlay_embedded_video_ || 137 if (force_use_overlay_embedded_video_ ||
134 manager_->ShouldUseVideoOverlayForEmbeddedEncryptedVideo()) { 138 player_manager_->ShouldUseVideoOverlayForEmbeddedEncryptedVideo()) {
135 // Defer stream texture creation until we are sure it's necessary. 139 // Defer stream texture creation until we are sure it's necessary.
136 needs_establish_peer_ = false; 140 needs_establish_peer_ = false;
137 current_frame_ = VideoFrame::CreateBlackFrame(gfx::Size(1, 1)); 141 current_frame_ = VideoFrame::CreateBlackFrame(gfx::Size(1, 1));
138 } 142 }
139 #endif // defined(VIDEO_HOLE) 143 #endif // defined(VIDEO_HOLE)
140 TryCreateStreamTextureProxyIfNeeded(); 144 TryCreateStreamTextureProxyIfNeeded();
141 } 145 }
142 146
143 WebMediaPlayerAndroid::~WebMediaPlayerAndroid() { 147 WebMediaPlayerAndroid::~WebMediaPlayerAndroid() {
144 SetVideoFrameProviderClient(NULL); 148 SetVideoFrameProviderClient(NULL);
145 client_->setWebLayer(NULL); 149 client_->setWebLayer(NULL);
146 150
147 if (manager_) { 151 if (player_manager_) {
148 manager_->DestroyPlayer(player_id_); 152 player_manager_->DestroyPlayer(player_id_);
149 manager_->UnregisterMediaPlayer(player_id_); 153 player_manager_->UnregisterMediaPlayer(player_id_);
150 } 154 }
151 155
152 if (stream_id_) { 156 if (stream_id_) {
153 GLES2Interface* gl = stream_texture_factory_->ContextGL(); 157 GLES2Interface* gl = stream_texture_factory_->ContextGL();
154 gl->DeleteTextures(1, &texture_id_); 158 gl->DeleteTextures(1, &texture_id_);
155 texture_id_ = 0; 159 texture_id_ = 0;
156 texture_mailbox_ = gpu::Mailbox(); 160 texture_mailbox_ = gpu::Mailbox();
157 stream_id_ = 0; 161 stream_id_ = 0;
158 } 162 }
159 163
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
225 // TODO(qinmin): The url might be redirected when android media player 229 // TODO(qinmin): The url might be redirected when android media player
226 // requests the stream. As a result, we cannot guarantee there is only 230 // requests the stream. As a result, we cannot guarantee there is only
227 // a single origin. Remove the following line when b/12573548 is fixed. 231 // a single origin. Remove the following line when b/12573548 is fixed.
228 // Check http://crbug.com/334204. 232 // Check http://crbug.com/334204.
229 info_loader_->set_single_origin(false); 233 info_loader_->set_single_origin(false);
230 info_loader_->Start(frame_); 234 info_loader_->Start(frame_);
231 } 235 }
232 236
233 url_ = url; 237 url_ = url;
234 GURL first_party_url = frame_->document().firstPartyForCookies(); 238 GURL first_party_url = frame_->document().firstPartyForCookies();
235 manager_->Initialize( 239 player_manager_->Initialize(
236 player_type_, player_id_, url, first_party_url, demuxer_client_id); 240 player_type_, player_id_, url, first_party_url, demuxer_client_id);
237 241
238 if (manager_->ShouldEnterFullscreen(frame_)) 242 if (player_manager_->ShouldEnterFullscreen(frame_))
239 manager_->EnterFullscreen(player_id_, frame_); 243 player_manager_->EnterFullscreen(player_id_, frame_);
240 244
241 UpdateNetworkState(WebMediaPlayer::NetworkStateLoading); 245 UpdateNetworkState(WebMediaPlayer::NetworkStateLoading);
242 UpdateReadyState(WebMediaPlayer::ReadyStateHaveNothing); 246 UpdateReadyState(WebMediaPlayer::ReadyStateHaveNothing);
243 } 247 }
244 248
245 void WebMediaPlayerAndroid::DidLoadMediaInfo(MediaInfoLoader::Status status) { 249 void WebMediaPlayerAndroid::DidLoadMediaInfo(MediaInfoLoader::Status status) {
246 DCHECK(!media_source_delegate_); 250 DCHECK(!media_source_delegate_);
247 if (status == MediaInfoLoader::kFailed) { 251 if (status == MediaInfoLoader::kFailed) {
248 info_loader_.reset(); 252 info_loader_.reset();
249 UpdateNetworkState(WebMediaPlayer::NetworkStateNetworkError); 253 UpdateNetworkState(WebMediaPlayer::NetworkStateNetworkError);
250 return; 254 return;
251 } 255 }
252 256
253 has_media_info_ = true; 257 has_media_info_ = true;
254 if (has_media_metadata_ && 258 if (has_media_metadata_ &&
255 ready_state_ != WebMediaPlayer::ReadyStateHaveEnoughData) { 259 ready_state_ != WebMediaPlayer::ReadyStateHaveEnoughData) {
256 UpdateReadyState(WebMediaPlayer::ReadyStateHaveMetadata); 260 UpdateReadyState(WebMediaPlayer::ReadyStateHaveMetadata);
257 UpdateReadyState(WebMediaPlayer::ReadyStateHaveEnoughData); 261 UpdateReadyState(WebMediaPlayer::ReadyStateHaveEnoughData);
258 } 262 }
259 // Android doesn't start fetching resources until an implementation-defined 263 // Android doesn't start fetching resources until an implementation-defined
260 // event (e.g. playback request) occurs. Sets the network state to IDLE 264 // event (e.g. playback request) occurs. Sets the network state to IDLE
261 // if play is not requested yet. 265 // if play is not requested yet.
262 if (!playing_started_) 266 if (!playing_started_)
263 UpdateNetworkState(WebMediaPlayer::NetworkStateIdle); 267 UpdateNetworkState(WebMediaPlayer::NetworkStateIdle);
264 } 268 }
265 269
266 void WebMediaPlayerAndroid::play() { 270 void WebMediaPlayerAndroid::play() {
267 #if defined(VIDEO_HOLE) 271 #if defined(VIDEO_HOLE)
268 if (hasVideo() && needs_external_surface_ && 272 if (hasVideo() && needs_external_surface_ &&
269 !manager_->IsInFullscreen(frame_)) { 273 !player_manager_->IsInFullscreen(frame_)) {
270 DCHECK(!needs_establish_peer_); 274 DCHECK(!needs_establish_peer_);
271 manager_->RequestExternalSurface(player_id_, last_computed_rect_); 275 player_manager_->RequestExternalSurface(player_id_, last_computed_rect_);
272 } 276 }
273 #endif // defined(VIDEO_HOLE) 277 #endif // defined(VIDEO_HOLE)
274 278
275 TryCreateStreamTextureProxyIfNeeded(); 279 TryCreateStreamTextureProxyIfNeeded();
276 // There is no need to establish the surface texture peer for fullscreen 280 // There is no need to establish the surface texture peer for fullscreen
277 // video. 281 // video.
278 if (hasVideo() && needs_establish_peer_ && !manager_->IsInFullscreen(frame_)) 282 if (hasVideo() && needs_establish_peer_ &&
283 !player_manager_->IsInFullscreen(frame_)) {
279 EstablishSurfaceTexturePeer(); 284 EstablishSurfaceTexturePeer();
285 }
280 286
281 if (paused()) 287 if (paused())
282 manager_->Start(player_id_); 288 player_manager_->Start(player_id_);
283 UpdatePlayingState(true); 289 UpdatePlayingState(true);
284 UpdateNetworkState(WebMediaPlayer::NetworkStateLoading); 290 UpdateNetworkState(WebMediaPlayer::NetworkStateLoading);
285 playing_started_ = true; 291 playing_started_ = true;
286 } 292 }
287 293
288 void WebMediaPlayerAndroid::pause() { 294 void WebMediaPlayerAndroid::pause() {
289 Pause(true); 295 Pause(true);
290 } 296 }
291 297
292 void WebMediaPlayerAndroid::seek(double seconds) { 298 void WebMediaPlayerAndroid::seek(double seconds) {
(...skipping 30 matching lines...) Expand all
323 return; 329 return;
324 } 330 }
325 331
326 seeking_ = true; 332 seeking_ = true;
327 seek_time_ = new_seek_time; 333 seek_time_ = new_seek_time;
328 334
329 if (media_source_delegate_) 335 if (media_source_delegate_)
330 media_source_delegate_->StartWaitingForSeek(seek_time_); 336 media_source_delegate_->StartWaitingForSeek(seek_time_);
331 337
332 // Kick off the asynchronous seek! 338 // Kick off the asynchronous seek!
333 manager_->Seek(player_id_, seek_time_); 339 player_manager_->Seek(player_id_, seek_time_);
334 } 340 }
335 341
336 bool WebMediaPlayerAndroid::supportsSave() const { 342 bool WebMediaPlayerAndroid::supportsSave() const {
337 return false; 343 return false;
338 } 344 }
339 345
340 void WebMediaPlayerAndroid::setRate(double rate) { 346 void WebMediaPlayerAndroid::setRate(double rate) {
341 NOTIMPLEMENTED(); 347 NOTIMPLEMENTED();
342 } 348 }
343 349
344 void WebMediaPlayerAndroid::setVolume(double volume) { 350 void WebMediaPlayerAndroid::setVolume(double volume) {
345 manager_->SetVolume(player_id_, volume); 351 player_manager_->SetVolume(player_id_, volume);
346 } 352 }
347 353
348 bool WebMediaPlayerAndroid::hasVideo() const { 354 bool WebMediaPlayerAndroid::hasVideo() const {
349 // If we have obtained video size information before, use it. 355 // If we have obtained video size information before, use it.
350 if (has_size_info_) 356 if (has_size_info_)
351 return !natural_size_.isEmpty(); 357 return !natural_size_.isEmpty();
352 358
353 // TODO(qinmin): need a better method to determine whether the current media 359 // TODO(qinmin): need a better method to determine whether the current media
354 // content contains video. Android does not provide any function to do 360 // content contains video. Android does not provide any function to do
355 // this. 361 // this.
(...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after
690 void WebMediaPlayerAndroid::OnVideoSizeChanged(int width, int height) { 696 void WebMediaPlayerAndroid::OnVideoSizeChanged(int width, int height) {
691 has_size_info_ = true; 697 has_size_info_ = true;
692 if (natural_size_.width == width && natural_size_.height == height) 698 if (natural_size_.width == width && natural_size_.height == height)
693 return; 699 return;
694 700
695 #if defined(VIDEO_HOLE) 701 #if defined(VIDEO_HOLE)
696 // Use H/W surface for encrypted video. 702 // Use H/W surface for encrypted video.
697 // TODO(qinmin): Change this so that only EME needs the H/W surface 703 // TODO(qinmin): Change this so that only EME needs the H/W surface
698 if (force_use_overlay_embedded_video_ || 704 if (force_use_overlay_embedded_video_ ||
699 (media_source_delegate_ && media_source_delegate_->IsVideoEncrypted() && 705 (media_source_delegate_ && media_source_delegate_->IsVideoEncrypted() &&
700 manager_->ShouldUseVideoOverlayForEmbeddedEncryptedVideo())) { 706 player_manager_->ShouldUseVideoOverlayForEmbeddedEncryptedVideo())) {
701 needs_external_surface_ = true; 707 needs_external_surface_ = true;
702 if (!paused() && !manager_->IsInFullscreen(frame_)) 708 if (!paused() && !player_manager_->IsInFullscreen(frame_))
703 manager_->RequestExternalSurface(player_id_, last_computed_rect_); 709 player_manager_->RequestExternalSurface(player_id_, last_computed_rect_);
704 } else if (stream_texture_proxy_ && !stream_id_) { 710 } else if (stream_texture_proxy_ && !stream_id_) {
705 // Do deferred stream texture creation finally. 711 // Do deferred stream texture creation finally.
706 DoCreateStreamTexture(); 712 DoCreateStreamTexture();
707 SetNeedsEstablishPeer(true); 713 SetNeedsEstablishPeer(true);
708 } 714 }
709 #endif // defined(VIDEO_HOLE) 715 #endif // defined(VIDEO_HOLE)
710 // When play() gets called, |natural_size_| may still be empty and 716 // When play() gets called, |natural_size_| may still be empty and
711 // EstablishSurfaceTexturePeer() will not get called. As a result, the video 717 // EstablishSurfaceTexturePeer() will not get called. As a result, the video
712 // may play without a surface texture. When we finally get the valid video 718 // may play without a surface texture. When we finally get the valid video
713 // size here, we should call EstablishSurfaceTexturePeer() if it has not been 719 // size here, we should call EstablishSurfaceTexturePeer() if it has not been
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
750 DCHECK(main_thread_checker_.CalledOnValidThread()); 756 DCHECK(main_thread_checker_.CalledOnValidThread());
751 DCHECK(!media_source_delegate_); 757 DCHECK(!media_source_delegate_);
752 SetNeedsEstablishPeer(true); 758 SetNeedsEstablishPeer(true);
753 if (!paused()) 759 if (!paused())
754 EstablishSurfaceTexturePeer(); 760 EstablishSurfaceTexturePeer();
755 is_remote_ = false; 761 is_remote_ = false;
756 ReallocateVideoFrame(); 762 ReallocateVideoFrame();
757 } 763 }
758 764
759 void WebMediaPlayerAndroid::OnDidEnterFullscreen() { 765 void WebMediaPlayerAndroid::OnDidEnterFullscreen() {
760 if (!manager_->IsInFullscreen(frame_)) { 766 if (!player_manager_->IsInFullscreen(frame_)) {
761 frame_->view()->willEnterFullScreen(); 767 frame_->view()->willEnterFullScreen();
762 frame_->view()->didEnterFullScreen(); 768 frame_->view()->didEnterFullScreen();
763 manager_->DidEnterFullscreen(frame_); 769 player_manager_->DidEnterFullscreen(frame_);
764 } 770 }
765 } 771 }
766 772
767 void WebMediaPlayerAndroid::OnDidExitFullscreen() { 773 void WebMediaPlayerAndroid::OnDidExitFullscreen() {
768 // |needs_external_surface_| is always false on non-TV devices. 774 // |needs_external_surface_| is always false on non-TV devices.
769 if (!needs_external_surface_) 775 if (!needs_external_surface_)
770 SetNeedsEstablishPeer(true); 776 SetNeedsEstablishPeer(true);
771 // We had the fullscreen surface connected to Android MediaPlayer, 777 // We had the fullscreen surface connected to Android MediaPlayer,
772 // so reconnect our surface texture for embedded playback. 778 // so reconnect our surface texture for embedded playback.
773 if (!paused() && needs_establish_peer_) 779 if (!paused() && needs_establish_peer_)
774 EstablishSurfaceTexturePeer(); 780 EstablishSurfaceTexturePeer();
775 781
776 #if defined(VIDEO_HOLE) 782 #if defined(VIDEO_HOLE)
777 if (!paused() && needs_external_surface_) 783 if (!paused() && needs_external_surface_)
778 manager_->RequestExternalSurface(player_id_, last_computed_rect_); 784 player_manager_->RequestExternalSurface(player_id_, last_computed_rect_);
779 #endif // defined(VIDEO_HOLE) 785 #endif // defined(VIDEO_HOLE)
780 786
781 frame_->view()->willExitFullScreen(); 787 frame_->view()->willExitFullScreen();
782 frame_->view()->didExitFullScreen(); 788 frame_->view()->didExitFullScreen();
783 manager_->DidExitFullscreen(); 789 player_manager_->DidExitFullscreen();
784 client_->repaint(); 790 client_->repaint();
785 } 791 }
786 792
787 void WebMediaPlayerAndroid::OnMediaPlayerPlay() { 793 void WebMediaPlayerAndroid::OnMediaPlayerPlay() {
788 UpdatePlayingState(true); 794 UpdatePlayingState(true);
789 client_->playbackStateChanged(); 795 client_->playbackStateChanged();
790 } 796 }
791 797
792 void WebMediaPlayerAndroid::OnMediaPlayerPause() { 798 void WebMediaPlayerAndroid::OnMediaPlayerPause() {
793 UpdatePlayingState(false); 799 UpdatePlayingState(false);
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
859 break; 865 break;
860 // If a WebMediaPlayer instance has entered into one of these states, 866 // If a WebMediaPlayer instance has entered into one of these states,
861 // the internal network state in HTMLMediaElement could be set to empty. 867 // the internal network state in HTMLMediaElement could be set to empty.
862 // And calling playbackStateChanged() could get this object deleted. 868 // And calling playbackStateChanged() could get this object deleted.
863 case WebMediaPlayer::NetworkStateEmpty: 869 case WebMediaPlayer::NetworkStateEmpty:
864 case WebMediaPlayer::NetworkStateFormatError: 870 case WebMediaPlayer::NetworkStateFormatError:
865 case WebMediaPlayer::NetworkStateNetworkError: 871 case WebMediaPlayer::NetworkStateNetworkError:
866 case WebMediaPlayer::NetworkStateDecodeError: 872 case WebMediaPlayer::NetworkStateDecodeError:
867 break; 873 break;
868 } 874 }
869 manager_->ReleaseResources(player_id_); 875 player_manager_->ReleaseResources(player_id_);
870 OnPlayerReleased(); 876 OnPlayerReleased();
871 } 877 }
872 878
873 void WebMediaPlayerAndroid::OnDestruct() { 879 void WebMediaPlayerAndroid::OnDestruct() {
874 if (manager_) 880 if (player_manager_)
875 manager_->UnregisterMediaPlayer(player_id_); 881 player_manager_->UnregisterMediaPlayer(player_id_);
876 Detach(); 882 Detach();
877 } 883 }
878 884
879 void WebMediaPlayerAndroid::Detach() { 885 void WebMediaPlayerAndroid::Detach() {
880 if (stream_id_) { 886 if (stream_id_) {
881 GLES2Interface* gl = stream_texture_factory_->ContextGL(); 887 GLES2Interface* gl = stream_texture_factory_->ContextGL();
882 gl->DeleteTextures(1, &texture_id_); 888 gl->DeleteTextures(1, &texture_id_);
883 texture_id_ = 0; 889 texture_id_ = 0;
884 texture_mailbox_ = gpu::Mailbox(); 890 texture_mailbox_ = gpu::Mailbox();
885 stream_id_ = 0; 891 stream_id_ = 0;
886 } 892 }
887 893
888 media_source_delegate_.reset(); 894 media_source_delegate_.reset();
889 { 895 {
890 base::AutoLock auto_lock(current_frame_lock_); 896 base::AutoLock auto_lock(current_frame_lock_);
891 current_frame_ = NULL; 897 current_frame_ = NULL;
892 } 898 }
893 is_remote_ = false; 899 is_remote_ = false;
894 manager_ = NULL; 900 player_manager_ = NULL;
895 } 901 }
896 902
897 void WebMediaPlayerAndroid::Pause(bool is_media_related_action) { 903 void WebMediaPlayerAndroid::Pause(bool is_media_related_action) {
898 manager_->Pause(player_id_, is_media_related_action); 904 player_manager_->Pause(player_id_, is_media_related_action);
899 UpdatePlayingState(false); 905 UpdatePlayingState(false);
900 } 906 }
901 907
902 void WebMediaPlayerAndroid::DrawRemotePlaybackText( 908 void WebMediaPlayerAndroid::DrawRemotePlaybackText(
903 const std::string& remote_playback_message) { 909 const std::string& remote_playback_message) {
904 910
905 DCHECK(main_thread_checker_.CalledOnValidThread()); 911 DCHECK(main_thread_checker_.CalledOnValidThread());
906 if (!video_weblayer_) 912 if (!video_weblayer_)
907 return; 913 return;
908 914
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after
1138 DCHECK(!texture_id_); 1144 DCHECK(!texture_id_);
1139 stream_id_ = stream_texture_factory_->CreateStreamTexture( 1145 stream_id_ = stream_texture_factory_->CreateStreamTexture(
1140 kGLTextureExternalOES, &texture_id_, &texture_mailbox_); 1146 kGLTextureExternalOES, &texture_id_, &texture_mailbox_);
1141 } 1147 }
1142 1148
1143 void WebMediaPlayerAndroid::SetNeedsEstablishPeer(bool needs_establish_peer) { 1149 void WebMediaPlayerAndroid::SetNeedsEstablishPeer(bool needs_establish_peer) {
1144 needs_establish_peer_ = needs_establish_peer; 1150 needs_establish_peer_ = needs_establish_peer;
1145 } 1151 }
1146 1152
1147 void WebMediaPlayerAndroid::setPoster(const blink::WebURL& poster) { 1153 void WebMediaPlayerAndroid::setPoster(const blink::WebURL& poster) {
1148 manager_->SetPoster(player_id_, poster); 1154 player_manager_->SetPoster(player_id_, poster);
1149 } 1155 }
1150 1156
1151 void WebMediaPlayerAndroid::UpdatePlayingState(bool is_playing) { 1157 void WebMediaPlayerAndroid::UpdatePlayingState(bool is_playing) {
1152 is_playing_ = is_playing; 1158 is_playing_ = is_playing;
1153 if (!delegate_) 1159 if (!delegate_)
1154 return; 1160 return;
1155 if (is_playing) 1161 if (is_playing)
1156 delegate_->DidPlay(this); 1162 delegate_->DidPlay(this);
1157 else 1163 else
1158 delegate_->DidPause(this); 1164 delegate_->DidPause(this);
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
1298 const std::string& key_system, 1304 const std::string& key_system,
1299 const unsigned char* init_data, 1305 const unsigned char* init_data,
1300 unsigned init_data_length) { 1306 unsigned init_data_length) {
1301 if (!IsKeySystemSupported(key_system)) 1307 if (!IsKeySystemSupported(key_system))
1302 return WebMediaPlayer::MediaKeyExceptionKeySystemNotSupported; 1308 return WebMediaPlayer::MediaKeyExceptionKeySystemNotSupported;
1303 1309
1304 // We do not support run-time switching between key systems for now. 1310 // We do not support run-time switching between key systems for now.
1305 if (current_key_system_.empty()) { 1311 if (current_key_system_.empty()) {
1306 if (!proxy_decryptor_) { 1312 if (!proxy_decryptor_) {
1307 proxy_decryptor_.reset(new ProxyDecryptor( 1313 proxy_decryptor_.reset(new ProxyDecryptor(
1308 manager_, 1314 cdm_manager_,
1309 base::Bind(&WebMediaPlayerAndroid::OnKeyAdded, 1315 base::Bind(&WebMediaPlayerAndroid::OnKeyAdded,
1310 weak_factory_.GetWeakPtr()), 1316 weak_factory_.GetWeakPtr()),
1311 base::Bind(&WebMediaPlayerAndroid::OnKeyError, 1317 base::Bind(&WebMediaPlayerAndroid::OnKeyError,
1312 weak_factory_.GetWeakPtr()), 1318 weak_factory_.GetWeakPtr()),
1313 base::Bind(&WebMediaPlayerAndroid::OnKeyMessage, 1319 base::Bind(&WebMediaPlayerAndroid::OnKeyMessage,
1314 weak_factory_.GetWeakPtr()))); 1320 weak_factory_.GetWeakPtr())));
1315 } 1321 }
1316 1322
1317 GURL security_origin(frame_->document().securityOrigin().toString()); 1323 GURL security_origin(frame_->document().securityOrigin().toString());
1318 if (!proxy_decryptor_->InitializeCDM(key_system, security_origin)) 1324 if (!proxy_decryptor_->InitializeCDM(key_system, security_origin))
1319 return WebMediaPlayer::MediaKeyExceptionKeySystemNotSupported; 1325 return WebMediaPlayer::MediaKeyExceptionKeySystemNotSupported;
1320 1326
1321 if (!decryptor_ready_cb_.is_null()) { 1327 if (!decryptor_ready_cb_.is_null()) {
1322 base::ResetAndReturn(&decryptor_ready_cb_) 1328 base::ResetAndReturn(&decryptor_ready_cb_)
1323 .Run(proxy_decryptor_->GetDecryptor()); 1329 .Run(proxy_decryptor_->GetDecryptor());
1324 } 1330 }
1325 1331
1326 manager_->SetCdm(player_id_, proxy_decryptor_->GetCdmId()); 1332 // Only browser CDMs have CDM ID. Render side CDMs (e.g. ClearKey CDM) do
1333 // not have a CDM ID and there is no need to call player_manager_->SetCdm().
1334 if (proxy_decryptor_->GetCdmId() != RendererCdmManager::kInvalidCdmId)
1335 player_manager_->SetCdm(player_id_, proxy_decryptor_->GetCdmId());
1336
1327 current_key_system_ = key_system; 1337 current_key_system_ = key_system;
1328 } else if (key_system != current_key_system_) { 1338 } else if (key_system != current_key_system_) {
1329 return WebMediaPlayer::MediaKeyExceptionInvalidPlayerState; 1339 return WebMediaPlayer::MediaKeyExceptionInvalidPlayerState;
1330 } 1340 }
1331 1341
1332 std::string init_data_type = init_data_type_; 1342 std::string init_data_type = init_data_type_;
1333 if (init_data_type.empty()) 1343 if (init_data_type.empty())
1334 init_data_type = GuessInitDataType(init_data, init_data_length); 1344 init_data_type = GuessInitDataType(init_data, init_data_length);
1335 1345
1336 // TODO(xhwang): We assume all streams are from the same container (thus have 1346 // TODO(xhwang): We assume all streams are from the same container (thus have
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
1431 if (!cdm) 1441 if (!cdm)
1432 return; 1442 return;
1433 1443
1434 web_cdm_ = ToWebContentDecryptionModuleImpl(cdm); 1444 web_cdm_ = ToWebContentDecryptionModuleImpl(cdm);
1435 if (!web_cdm_) 1445 if (!web_cdm_)
1436 return; 1446 return;
1437 1447
1438 if (!decryptor_ready_cb_.is_null()) 1448 if (!decryptor_ready_cb_.is_null())
1439 base::ResetAndReturn(&decryptor_ready_cb_).Run(web_cdm_->GetDecryptor()); 1449 base::ResetAndReturn(&decryptor_ready_cb_).Run(web_cdm_->GetDecryptor());
1440 1450
1441 manager_->SetCdm(player_id_, web_cdm_->GetCdmId()); 1451 if (web_cdm_->GetCdmId() != RendererCdmManager::kInvalidCdmId)
1452 player_manager_->SetCdm(player_id_, web_cdm_->GetCdmId());
1442 } 1453 }
1443 1454
1444 void WebMediaPlayerAndroid::OnKeyAdded(const std::string& session_id) { 1455 void WebMediaPlayerAndroid::OnKeyAdded(const std::string& session_id) {
1445 EmeUMAHistogramCounts(current_key_system_, "KeyAdded", 1); 1456 EmeUMAHistogramCounts(current_key_system_, "KeyAdded", 1);
1446 1457
1447 client_->keyAdded( 1458 client_->keyAdded(
1448 WebString::fromUTF8(GetPrefixedKeySystemName(current_key_system_)), 1459 WebString::fromUTF8(GetPrefixedKeySystemName(current_key_system_)),
1449 WebString::fromUTF8(session_id)); 1460 WebString::fromUTF8(session_id));
1450 } 1461 }
1451 1462
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
1539 1550
1540 if (web_cdm_) { 1551 if (web_cdm_) {
1541 decryptor_ready_cb.Run(web_cdm_->GetDecryptor()); 1552 decryptor_ready_cb.Run(web_cdm_->GetDecryptor());
1542 return; 1553 return;
1543 } 1554 }
1544 1555
1545 decryptor_ready_cb_ = decryptor_ready_cb; 1556 decryptor_ready_cb_ = decryptor_ready_cb;
1546 } 1557 }
1547 1558
1548 void WebMediaPlayerAndroid::enterFullscreen() { 1559 void WebMediaPlayerAndroid::enterFullscreen() {
1549 if (manager_->CanEnterFullscreen(frame_)) { 1560 if (player_manager_->CanEnterFullscreen(frame_)) {
1550 manager_->EnterFullscreen(player_id_, frame_); 1561 player_manager_->EnterFullscreen(player_id_, frame_);
1551 SetNeedsEstablishPeer(false); 1562 SetNeedsEstablishPeer(false);
1552 } 1563 }
1553 } 1564 }
1554 1565
1555 void WebMediaPlayerAndroid::exitFullscreen() { 1566 void WebMediaPlayerAndroid::exitFullscreen() {
1556 manager_->ExitFullscreen(player_id_); 1567 player_manager_->ExitFullscreen(player_id_);
1557 } 1568 }
1558 1569
1559 bool WebMediaPlayerAndroid::canEnterFullscreen() const { 1570 bool WebMediaPlayerAndroid::canEnterFullscreen() const {
1560 return manager_->CanEnterFullscreen(frame_); 1571 return player_manager_->CanEnterFullscreen(frame_);
1561 } 1572 }
1562 1573
1563 } // namespace content 1574 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698