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

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: Ready for review Created 6 years, 7 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_cdm_manager.h"
22 #include "content/renderer/media/android/renderer_demuxer_android.h" 23 #include "content/renderer/media/android/renderer_demuxer_android.h"
23 #include "content/renderer/media/android/renderer_media_player_manager.h" 24 #include "content/renderer/media/android/renderer_media_player_manager.h"
24 #include "content/renderer/media/crypto/key_systems.h" 25 #include "content/renderer/media/crypto/key_systems.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"
(...skipping 46 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 340 matching lines...) Expand 10 before | Expand all | Expand 10 after
696 void WebMediaPlayerAndroid::OnVideoSizeChanged(int width, int height) { 702 void WebMediaPlayerAndroid::OnVideoSizeChanged(int width, int height) {
697 has_size_info_ = true; 703 has_size_info_ = true;
698 if (natural_size_.width == width && natural_size_.height == height) 704 if (natural_size_.width == width && natural_size_.height == height)
699 return; 705 return;
700 706
701 #if defined(VIDEO_HOLE) 707 #if defined(VIDEO_HOLE)
702 // Use H/W surface for encrypted video. 708 // Use H/W surface for encrypted video.
703 // TODO(qinmin): Change this so that only EME needs the H/W surface 709 // TODO(qinmin): Change this so that only EME needs the H/W surface
704 if (force_use_overlay_embedded_video_ || 710 if (force_use_overlay_embedded_video_ ||
705 (media_source_delegate_ && media_source_delegate_->IsVideoEncrypted() && 711 (media_source_delegate_ && media_source_delegate_->IsVideoEncrypted() &&
706 manager_->ShouldUseVideoOverlayForEmbeddedEncryptedVideo())) { 712 player_manager_->ShouldUseVideoOverlayForEmbeddedEncryptedVideo())) {
707 needs_external_surface_ = true; 713 needs_external_surface_ = true;
708 if (!paused() && !manager_->IsInFullscreen(frame_)) 714 if (!paused() && !player_manager_->IsInFullscreen(frame_))
709 manager_->RequestExternalSurface(player_id_, last_computed_rect_); 715 player_manager_->RequestExternalSurface(player_id_, last_computed_rect_);
710 } else if (stream_texture_proxy_ && !stream_id_) { 716 } else if (stream_texture_proxy_ && !stream_id_) {
711 // Do deferred stream texture creation finally. 717 // Do deferred stream texture creation finally.
712 DoCreateStreamTexture(); 718 DoCreateStreamTexture();
713 SetNeedsEstablishPeer(true); 719 SetNeedsEstablishPeer(true);
714 } 720 }
715 #endif // defined(VIDEO_HOLE) 721 #endif // defined(VIDEO_HOLE)
716 // When play() gets called, |natural_size_| may still be empty and 722 // When play() gets called, |natural_size_| may still be empty and
717 // EstablishSurfaceTexturePeer() will not get called. As a result, the video 723 // EstablishSurfaceTexturePeer() will not get called. As a result, the video
718 // may play without a surface texture. When we finally get the valid video 724 // may play without a surface texture. When we finally get the valid video
719 // size here, we should call EstablishSurfaceTexturePeer() if it has not been 725 // size here, we should call EstablishSurfaceTexturePeer() if it has not been
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
756 DCHECK(main_thread_checker_.CalledOnValidThread()); 762 DCHECK(main_thread_checker_.CalledOnValidThread());
757 DCHECK(!media_source_delegate_); 763 DCHECK(!media_source_delegate_);
758 SetNeedsEstablishPeer(true); 764 SetNeedsEstablishPeer(true);
759 if (!paused()) 765 if (!paused())
760 EstablishSurfaceTexturePeer(); 766 EstablishSurfaceTexturePeer();
761 is_remote_ = false; 767 is_remote_ = false;
762 ReallocateVideoFrame(); 768 ReallocateVideoFrame();
763 } 769 }
764 770
765 void WebMediaPlayerAndroid::OnDidEnterFullscreen() { 771 void WebMediaPlayerAndroid::OnDidEnterFullscreen() {
766 if (!manager_->IsInFullscreen(frame_)) { 772 if (!player_manager_->IsInFullscreen(frame_)) {
767 frame_->view()->willEnterFullScreen(); 773 frame_->view()->willEnterFullScreen();
768 frame_->view()->didEnterFullScreen(); 774 frame_->view()->didEnterFullScreen();
769 manager_->DidEnterFullscreen(frame_); 775 player_manager_->DidEnterFullscreen(frame_);
770 } 776 }
771 } 777 }
772 778
773 void WebMediaPlayerAndroid::OnDidExitFullscreen() { 779 void WebMediaPlayerAndroid::OnDidExitFullscreen() {
774 // |needs_external_surface_| is always false on non-TV devices. 780 // |needs_external_surface_| is always false on non-TV devices.
775 if (!needs_external_surface_) 781 if (!needs_external_surface_)
776 SetNeedsEstablishPeer(true); 782 SetNeedsEstablishPeer(true);
777 // We had the fullscreen surface connected to Android MediaPlayer, 783 // We had the fullscreen surface connected to Android MediaPlayer,
778 // so reconnect our surface texture for embedded playback. 784 // so reconnect our surface texture for embedded playback.
779 if (!paused() && needs_establish_peer_) 785 if (!paused() && needs_establish_peer_)
780 EstablishSurfaceTexturePeer(); 786 EstablishSurfaceTexturePeer();
781 787
782 #if defined(VIDEO_HOLE) 788 #if defined(VIDEO_HOLE)
783 if (!paused() && needs_external_surface_) 789 if (!paused() && needs_external_surface_)
784 manager_->RequestExternalSurface(player_id_, last_computed_rect_); 790 player_manager_->RequestExternalSurface(player_id_, last_computed_rect_);
785 #endif // defined(VIDEO_HOLE) 791 #endif // defined(VIDEO_HOLE)
786 792
787 frame_->view()->willExitFullScreen(); 793 frame_->view()->willExitFullScreen();
788 frame_->view()->didExitFullScreen(); 794 frame_->view()->didExitFullScreen();
789 manager_->DidExitFullscreen(); 795 player_manager_->DidExitFullscreen();
790 client_->repaint(); 796 client_->repaint();
791 } 797 }
792 798
793 void WebMediaPlayerAndroid::OnMediaPlayerPlay() { 799 void WebMediaPlayerAndroid::OnMediaPlayerPlay() {
794 UpdatePlayingState(true); 800 UpdatePlayingState(true);
795 client_->playbackStateChanged(); 801 client_->playbackStateChanged();
796 } 802 }
797 803
798 void WebMediaPlayerAndroid::OnMediaPlayerPause() { 804 void WebMediaPlayerAndroid::OnMediaPlayerPause() {
799 UpdatePlayingState(false); 805 UpdatePlayingState(false);
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
865 break; 871 break;
866 // If a WebMediaPlayer instance has entered into one of these states, 872 // If a WebMediaPlayer instance has entered into one of these states,
867 // the internal network state in HTMLMediaElement could be set to empty. 873 // the internal network state in HTMLMediaElement could be set to empty.
868 // And calling playbackStateChanged() could get this object deleted. 874 // And calling playbackStateChanged() could get this object deleted.
869 case WebMediaPlayer::NetworkStateEmpty: 875 case WebMediaPlayer::NetworkStateEmpty:
870 case WebMediaPlayer::NetworkStateFormatError: 876 case WebMediaPlayer::NetworkStateFormatError:
871 case WebMediaPlayer::NetworkStateNetworkError: 877 case WebMediaPlayer::NetworkStateNetworkError:
872 case WebMediaPlayer::NetworkStateDecodeError: 878 case WebMediaPlayer::NetworkStateDecodeError:
873 break; 879 break;
874 } 880 }
875 manager_->ReleaseResources(player_id_); 881 player_manager_->ReleaseResources(player_id_);
876 OnPlayerReleased(); 882 OnPlayerReleased();
877 } 883 }
878 884
879 void WebMediaPlayerAndroid::OnDestruct() { 885 void WebMediaPlayerAndroid::OnDestruct() {
880 if (manager_) 886 if (player_manager_)
881 manager_->UnregisterMediaPlayer(player_id_); 887 player_manager_->UnregisterMediaPlayer(player_id_);
882 Detach(); 888 Detach();
883 } 889 }
884 890
885 void WebMediaPlayerAndroid::Detach() { 891 void WebMediaPlayerAndroid::Detach() {
886 if (stream_id_) { 892 if (stream_id_) {
887 GLES2Interface* gl = stream_texture_factory_->ContextGL(); 893 GLES2Interface* gl = stream_texture_factory_->ContextGL();
888 gl->DeleteTextures(1, &texture_id_); 894 gl->DeleteTextures(1, &texture_id_);
889 texture_id_ = 0; 895 texture_id_ = 0;
890 texture_mailbox_ = gpu::Mailbox(); 896 texture_mailbox_ = gpu::Mailbox();
891 stream_id_ = 0; 897 stream_id_ = 0;
892 } 898 }
893 899
894 media_source_delegate_.reset(); 900 media_source_delegate_.reset();
895 { 901 {
896 base::AutoLock auto_lock(current_frame_lock_); 902 base::AutoLock auto_lock(current_frame_lock_);
897 current_frame_ = NULL; 903 current_frame_ = NULL;
898 } 904 }
899 is_remote_ = false; 905 is_remote_ = false;
900 manager_ = NULL; 906 player_manager_ = NULL;
901 } 907 }
902 908
903 void WebMediaPlayerAndroid::Pause(bool is_media_related_action) { 909 void WebMediaPlayerAndroid::Pause(bool is_media_related_action) {
904 manager_->Pause(player_id_, is_media_related_action); 910 player_manager_->Pause(player_id_, is_media_related_action);
905 UpdatePlayingState(false); 911 UpdatePlayingState(false);
906 } 912 }
907 913
908 void WebMediaPlayerAndroid::DrawRemotePlaybackText( 914 void WebMediaPlayerAndroid::DrawRemotePlaybackText(
909 const std::string& remote_playback_message) { 915 const std::string& remote_playback_message) {
910 916
911 DCHECK(main_thread_checker_.CalledOnValidThread()); 917 DCHECK(main_thread_checker_.CalledOnValidThread());
912 if (!video_weblayer_) 918 if (!video_weblayer_)
913 return; 919 return;
914 920
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after
1144 DCHECK(!texture_id_); 1150 DCHECK(!texture_id_);
1145 stream_id_ = stream_texture_factory_->CreateStreamTexture( 1151 stream_id_ = stream_texture_factory_->CreateStreamTexture(
1146 kGLTextureExternalOES, &texture_id_, &texture_mailbox_); 1152 kGLTextureExternalOES, &texture_id_, &texture_mailbox_);
1147 } 1153 }
1148 1154
1149 void WebMediaPlayerAndroid::SetNeedsEstablishPeer(bool needs_establish_peer) { 1155 void WebMediaPlayerAndroid::SetNeedsEstablishPeer(bool needs_establish_peer) {
1150 needs_establish_peer_ = needs_establish_peer; 1156 needs_establish_peer_ = needs_establish_peer;
1151 } 1157 }
1152 1158
1153 void WebMediaPlayerAndroid::setPoster(const blink::WebURL& poster) { 1159 void WebMediaPlayerAndroid::setPoster(const blink::WebURL& poster) {
1154 manager_->SetPoster(player_id_, poster); 1160 player_manager_->SetPoster(player_id_, poster);
1155 } 1161 }
1156 1162
1157 void WebMediaPlayerAndroid::UpdatePlayingState(bool is_playing) { 1163 void WebMediaPlayerAndroid::UpdatePlayingState(bool is_playing) {
1158 is_playing_ = is_playing; 1164 is_playing_ = is_playing;
1159 if (!delegate_) 1165 if (!delegate_)
1160 return; 1166 return;
1161 if (is_playing) 1167 if (is_playing)
1162 delegate_->DidPlay(this); 1168 delegate_->DidPlay(this);
1163 else 1169 else
1164 delegate_->DidPause(this); 1170 delegate_->DidPause(this);
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
1304 const std::string& key_system, 1310 const std::string& key_system,
1305 const unsigned char* init_data, 1311 const unsigned char* init_data,
1306 unsigned init_data_length) { 1312 unsigned init_data_length) {
1307 if (!IsKeySystemSupported(key_system)) 1313 if (!IsKeySystemSupported(key_system))
1308 return WebMediaPlayer::MediaKeyExceptionKeySystemNotSupported; 1314 return WebMediaPlayer::MediaKeyExceptionKeySystemNotSupported;
1309 1315
1310 // We do not support run-time switching between key systems for now. 1316 // We do not support run-time switching between key systems for now.
1311 if (current_key_system_.empty()) { 1317 if (current_key_system_.empty()) {
1312 if (!proxy_decryptor_) { 1318 if (!proxy_decryptor_) {
1313 proxy_decryptor_.reset(new ProxyDecryptor( 1319 proxy_decryptor_.reset(new ProxyDecryptor(
1314 manager_, 1320 cdm_manager_,
1315 base::Bind(&WebMediaPlayerAndroid::OnKeyAdded, 1321 base::Bind(&WebMediaPlayerAndroid::OnKeyAdded,
1316 weak_factory_.GetWeakPtr()), 1322 weak_factory_.GetWeakPtr()),
1317 base::Bind(&WebMediaPlayerAndroid::OnKeyError, 1323 base::Bind(&WebMediaPlayerAndroid::OnKeyError,
1318 weak_factory_.GetWeakPtr()), 1324 weak_factory_.GetWeakPtr()),
1319 base::Bind(&WebMediaPlayerAndroid::OnKeyMessage, 1325 base::Bind(&WebMediaPlayerAndroid::OnKeyMessage,
1320 weak_factory_.GetWeakPtr()))); 1326 weak_factory_.GetWeakPtr())));
1321 } 1327 }
1322 1328
1323 GURL security_origin(frame_->document().securityOrigin().toString()); 1329 GURL security_origin(frame_->document().securityOrigin().toString());
1324 if (!proxy_decryptor_->InitializeCDM(key_system, security_origin)) 1330 if (!proxy_decryptor_->InitializeCDM(key_system, security_origin))
1325 return WebMediaPlayer::MediaKeyExceptionKeySystemNotSupported; 1331 return WebMediaPlayer::MediaKeyExceptionKeySystemNotSupported;
1326 1332
1327 if (!decryptor_ready_cb_.is_null()) { 1333 if (!decryptor_ready_cb_.is_null()) {
1328 base::ResetAndReturn(&decryptor_ready_cb_) 1334 base::ResetAndReturn(&decryptor_ready_cb_)
1329 .Run(proxy_decryptor_->GetDecryptor()); 1335 .Run(proxy_decryptor_->GetDecryptor());
1330 } 1336 }
1331 1337
1332 manager_->SetCdm(player_id_, proxy_decryptor_->GetCdmId()); 1338 if (proxy_decryptor_->GetCdmId() != RendererCdmManager::kInvalidCdmId)
1339 player_manager_->SetCdm(player_id_, proxy_decryptor_->GetCdmId());
ddorwin 2014/05/23 23:28:37 This handles the Clear Key case, right? Should we
xhwang 2014/05/27 22:57:41 Done.
1340
1333 current_key_system_ = key_system; 1341 current_key_system_ = key_system;
1334 } else if (key_system != current_key_system_) { 1342 } else if (key_system != current_key_system_) {
1335 return WebMediaPlayer::MediaKeyExceptionInvalidPlayerState; 1343 return WebMediaPlayer::MediaKeyExceptionInvalidPlayerState;
1336 } 1344 }
1337 1345
1338 std::string init_data_type = init_data_type_; 1346 std::string init_data_type = init_data_type_;
1339 if (init_data_type.empty()) 1347 if (init_data_type.empty())
1340 init_data_type = GuessInitDataType(init_data, init_data_length); 1348 init_data_type = GuessInitDataType(init_data, init_data_length);
1341 1349
1342 // TODO(xhwang): We assume all streams are from the same container (thus have 1350 // 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
1437 if (!cdm) 1445 if (!cdm)
1438 return; 1446 return;
1439 1447
1440 web_cdm_ = ToWebContentDecryptionModuleImpl(cdm); 1448 web_cdm_ = ToWebContentDecryptionModuleImpl(cdm);
1441 if (!web_cdm_) 1449 if (!web_cdm_)
1442 return; 1450 return;
1443 1451
1444 if (!decryptor_ready_cb_.is_null()) 1452 if (!decryptor_ready_cb_.is_null())
1445 base::ResetAndReturn(&decryptor_ready_cb_).Run(web_cdm_->GetDecryptor()); 1453 base::ResetAndReturn(&decryptor_ready_cb_).Run(web_cdm_->GetDecryptor());
1446 1454
1447 manager_->SetCdm(player_id_, web_cdm_->GetCdmId()); 1455 if (web_cdm_->GetCdmId() != RendererCdmManager::kInvalidCdmId)
1456 player_manager_->SetCdm(player_id_, web_cdm_->GetCdmId());
1448 } 1457 }
1449 1458
1450 void WebMediaPlayerAndroid::OnKeyAdded(const std::string& session_id) { 1459 void WebMediaPlayerAndroid::OnKeyAdded(const std::string& session_id) {
1451 EmeUMAHistogramCounts(current_key_system_, "KeyAdded", 1); 1460 EmeUMAHistogramCounts(current_key_system_, "KeyAdded", 1);
1452 1461
1453 client_->keyAdded( 1462 client_->keyAdded(
1454 WebString::fromUTF8(GetPrefixedKeySystemName(current_key_system_)), 1463 WebString::fromUTF8(GetPrefixedKeySystemName(current_key_system_)),
1455 WebString::fromUTF8(session_id)); 1464 WebString::fromUTF8(session_id));
1456 } 1465 }
1457 1466
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
1545 1554
1546 if (web_cdm_) { 1555 if (web_cdm_) {
1547 decryptor_ready_cb.Run(web_cdm_->GetDecryptor()); 1556 decryptor_ready_cb.Run(web_cdm_->GetDecryptor());
1548 return; 1557 return;
1549 } 1558 }
1550 1559
1551 decryptor_ready_cb_ = decryptor_ready_cb; 1560 decryptor_ready_cb_ = decryptor_ready_cb;
1552 } 1561 }
1553 1562
1554 void WebMediaPlayerAndroid::enterFullscreen() { 1563 void WebMediaPlayerAndroid::enterFullscreen() {
1555 if (manager_->CanEnterFullscreen(frame_)) { 1564 if (player_manager_->CanEnterFullscreen(frame_)) {
1556 manager_->EnterFullscreen(player_id_, frame_); 1565 player_manager_->EnterFullscreen(player_id_, frame_);
1557 SetNeedsEstablishPeer(false); 1566 SetNeedsEstablishPeer(false);
1558 } 1567 }
1559 } 1568 }
1560 1569
1561 void WebMediaPlayerAndroid::exitFullscreen() { 1570 void WebMediaPlayerAndroid::exitFullscreen() {
1562 manager_->ExitFullscreen(player_id_); 1571 player_manager_->ExitFullscreen(player_id_);
1563 } 1572 }
1564 1573
1565 bool WebMediaPlayerAndroid::canEnterFullscreen() const { 1574 bool WebMediaPlayerAndroid::canEnterFullscreen() const {
1566 return manager_->CanEnterFullscreen(frame_); 1575 return player_manager_->CanEnterFullscreen(frame_);
1567 } 1576 }
1568 1577
1569 } // namespace content 1578 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698