Chromium Code Reviews| OLD | NEW | 
|---|---|
| 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/android/build_info.h" | 9 #include "base/android/build_info.h" | 
| 10 #include "base/bind.h" | 10 #include "base/bind.h" | 
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 139 stream_texture_factory_(factory), | 139 stream_texture_factory_(factory), | 
| 140 needs_external_surface_(false), | 140 needs_external_surface_(false), | 
| 141 video_frame_provider_client_(NULL), | 141 video_frame_provider_client_(NULL), | 
| 142 pending_playback_(false), | 142 pending_playback_(false), | 
| 143 player_type_(MEDIA_PLAYER_TYPE_URL), | 143 player_type_(MEDIA_PLAYER_TYPE_URL), | 
| 144 current_time_(0), | 144 current_time_(0), | 
| 145 is_remote_(false), | 145 is_remote_(false), | 
| 146 media_log_(media_log), | 146 media_log_(media_log), | 
| 147 web_cdm_(NULL), | 147 web_cdm_(NULL), | 
| 148 allow_stored_credentials_(false), | 148 allow_stored_credentials_(false), | 
| 149 is_local_resource_(false), | |
| 149 weak_factory_(this) { | 150 weak_factory_(this) { | 
| 150 DCHECK(player_manager_); | 151 DCHECK(player_manager_); | 
| 151 DCHECK(cdm_manager_); | 152 DCHECK(cdm_manager_); | 
| 152 | 153 | 
| 153 DCHECK(main_thread_checker_.CalledOnValidThread()); | 154 DCHECK(main_thread_checker_.CalledOnValidThread()); | 
| 154 | 155 | 
| 155 player_id_ = player_manager_->RegisterMediaPlayer(this); | 156 player_id_ = player_manager_->RegisterMediaPlayer(this); | 
| 156 | 157 | 
| 157 #if defined(VIDEO_HOLE) | 158 #if defined(VIDEO_HOLE) | 
| 158 force_use_overlay_embedded_video_ = CommandLine::ForCurrentProcess()-> | 159 force_use_overlay_embedded_video_ = CommandLine::ForCurrentProcess()-> | 
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 209 player_type_ = MEDIA_PLAYER_TYPE_MEDIA_SOURCE; | 210 player_type_ = MEDIA_PLAYER_TYPE_MEDIA_SOURCE; | 
| 210 break; | 211 break; | 
| 211 | 212 | 
| 212 case LoadTypeMediaStream: | 213 case LoadTypeMediaStream: | 
| 213 CHECK(false) << "WebMediaPlayerAndroid doesn't support MediaStream on " | 214 CHECK(false) << "WebMediaPlayerAndroid doesn't support MediaStream on " | 
| 214 "this platform"; | 215 "this platform"; | 
| 215 return; | 216 return; | 
| 216 } | 217 } | 
| 217 | 218 | 
| 218 url_ = url; | 219 url_ = url; | 
| 220 is_local_resource_ = IsLocalResource(); | |
| 219 int demuxer_client_id = 0; | 221 int demuxer_client_id = 0; | 
| 220 if (player_type_ != MEDIA_PLAYER_TYPE_URL) { | 222 if (player_type_ != MEDIA_PLAYER_TYPE_URL) { | 
| 221 RendererDemuxerAndroid* demuxer = | 223 RendererDemuxerAndroid* demuxer = | 
| 222 RenderThreadImpl::current()->renderer_demuxer(); | 224 RenderThreadImpl::current()->renderer_demuxer(); | 
| 223 demuxer_client_id = demuxer->GetNextDemuxerClientID(); | 225 demuxer_client_id = demuxer->GetNextDemuxerClientID(); | 
| 224 | 226 | 
| 225 media_source_delegate_.reset(new MediaSourceDelegate( | 227 media_source_delegate_.reset(new MediaSourceDelegate( | 
| 226 demuxer, demuxer_client_id, media_loop_, media_log_)); | 228 demuxer, demuxer_client_id, media_loop_, media_log_)); | 
| 227 | 229 | 
| 228 if (player_type_ == MEDIA_PLAYER_TYPE_MEDIA_SOURCE) { | 230 if (player_type_ == MEDIA_PLAYER_TYPE_MEDIA_SOURCE) { | 
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 270 UpdateNetworkState(WebMediaPlayer::NetworkStateNetworkError); | 272 UpdateNetworkState(WebMediaPlayer::NetworkStateNetworkError); | 
| 271 return; | 273 return; | 
| 272 } | 274 } | 
| 273 | 275 | 
| 274 InitializePlayer( | 276 InitializePlayer( | 
| 275 redirected_url, first_party_for_cookies, allow_stored_credentials, 0); | 277 redirected_url, first_party_for_cookies, allow_stored_credentials, 0); | 
| 276 | 278 | 
| 277 UpdateNetworkState(WebMediaPlayer::NetworkStateIdle); | 279 UpdateNetworkState(WebMediaPlayer::NetworkStateIdle); | 
| 278 } | 280 } | 
| 279 | 281 | 
| 282 bool WebMediaPlayerAndroid::IsLocalResource() { | |
| 283 if (url_.SchemeIsFile() || url_.SchemeIsBlob()) | |
| 284 return true; | |
| 285 | |
| 286 if (url_.spec().find("//127.0.0.1/") != std::string::npos || // port 80 | |
| 
 
qinmin
2014/08/26 03:44:17
use:
 std::string host = url_.host();
 if (!host.c
 
amogh.bihani
2014/08/26 05:31:14
Done.
 
 | |
| 287 url_.spec().find("//localhost/") != std::string::npos || | |
| 288 url_.spec().find("//127.0.0.1:") != std::string::npos || // any port | |
| 289 url_.spec().find("//localhost:") != std::string::npos) { | |
| 290 return true; | |
| 291 } | |
| 292 | |
| 293 return false; | |
| 294 } | |
| 295 | |
| 280 void WebMediaPlayerAndroid::play() { | 296 void WebMediaPlayerAndroid::play() { | 
| 281 DCHECK(main_thread_checker_.CalledOnValidThread()); | 297 DCHECK(main_thread_checker_.CalledOnValidThread()); | 
| 282 #if defined(VIDEO_HOLE) | 298 #if defined(VIDEO_HOLE) | 
| 283 if (hasVideo() && needs_external_surface_ && | 299 if (hasVideo() && needs_external_surface_ && | 
| 284 !player_manager_->IsInFullscreen(frame_)) { | 300 !player_manager_->IsInFullscreen(frame_)) { | 
| 285 DCHECK(!needs_establish_peer_); | 301 DCHECK(!needs_establish_peer_); | 
| 286 player_manager_->RequestExternalSurface(player_id_, last_computed_rect_); | 302 player_manager_->RequestExternalSurface(player_id_, last_computed_rect_); | 
| 287 } | 303 } | 
| 288 #endif // defined(VIDEO_HOLE) | 304 #endif // defined(VIDEO_HOLE) | 
| 289 | 305 | 
| (...skipping 382 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 672 return media_source_delegate_->VideoDecodedByteCount(); | 688 return media_source_delegate_->VideoDecodedByteCount(); | 
| 673 NOTIMPLEMENTED(); | 689 NOTIMPLEMENTED(); | 
| 674 return 0; | 690 return 0; | 
| 675 } | 691 } | 
| 676 | 692 | 
| 677 void WebMediaPlayerAndroid::OnMediaMetadataChanged( | 693 void WebMediaPlayerAndroid::OnMediaMetadataChanged( | 
| 678 const base::TimeDelta& duration, int width, int height, bool success) { | 694 const base::TimeDelta& duration, int width, int height, bool success) { | 
| 679 DCHECK(main_thread_checker_.CalledOnValidThread()); | 695 DCHECK(main_thread_checker_.CalledOnValidThread()); | 
| 680 bool need_to_signal_duration_changed = false; | 696 bool need_to_signal_duration_changed = false; | 
| 681 | 697 | 
| 682 if (url_.SchemeIs("file")) | 698 if (is_local_resource_) | 
| 683 UpdateNetworkState(WebMediaPlayer::NetworkStateLoaded); | 699 UpdateNetworkState(WebMediaPlayer::NetworkStateLoaded); | 
| 684 | 700 | 
| 685 // Update duration, if necessary, prior to ready state updates that may | 701 // Update duration, if necessary, prior to ready state updates that may | 
| 686 // cause duration() query. | 702 // cause duration() query. | 
| 687 if (!ignore_metadata_duration_change_ && duration_ != duration) { | 703 if (!ignore_metadata_duration_change_ && duration_ != duration) { | 
| 688 duration_ = duration; | 704 duration_ = duration; | 
| 689 | 705 | 
| 690 // Client readyState transition from HAVE_NOTHING to HAVE_METADATA | 706 // Client readyState transition from HAVE_NOTHING to HAVE_METADATA | 
| 691 // already triggers a durationchanged event. If this is a different | 707 // already triggers a durationchanged event. If this is a different | 
| 692 // transition, remember to signal durationchanged. | 708 // transition, remember to signal durationchanged. | 
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 830 | 846 | 
| 831 // TODO(qinmin): This is a hack. We need the media element to stop showing the | 847 // TODO(qinmin): This is a hack. We need the media element to stop showing the | 
| 832 // poster image by forcing it to call setDisplayMode(video). Should move the | 848 // poster image by forcing it to call setDisplayMode(video). Should move the | 
| 833 // logic into HTMLMediaElement.cpp. | 849 // logic into HTMLMediaElement.cpp. | 
| 834 client_->timeChanged(); | 850 client_->timeChanged(); | 
| 835 } | 851 } | 
| 836 | 852 | 
| 837 void WebMediaPlayerAndroid::OnTimeUpdate(const base::TimeDelta& current_time) { | 853 void WebMediaPlayerAndroid::OnTimeUpdate(const base::TimeDelta& current_time) { | 
| 838 DCHECK(main_thread_checker_.CalledOnValidThread()); | 854 DCHECK(main_thread_checker_.CalledOnValidThread()); | 
| 839 current_time_ = current_time.InSecondsF(); | 855 current_time_ = current_time.InSecondsF(); | 
| 856 if (is_local_resource_ && current_time_ <= duration()) | |
| 
 
amogh.bihani
2014/08/22 09:02:45
I have used a bool instead of calling IsLocalResou
 
 | |
| 857 buffered_[0].end = current_time_; | |
| 840 } | 858 } | 
| 841 | 859 | 
| 842 void WebMediaPlayerAndroid::OnConnectedToRemoteDevice( | 860 void WebMediaPlayerAndroid::OnConnectedToRemoteDevice( | 
| 843 const std::string& remote_playback_message) { | 861 const std::string& remote_playback_message) { | 
| 844 DCHECK(main_thread_checker_.CalledOnValidThread()); | 862 DCHECK(main_thread_checker_.CalledOnValidThread()); | 
| 845 DCHECK(!media_source_delegate_); | 863 DCHECK(!media_source_delegate_); | 
| 846 DrawRemotePlaybackText(remote_playback_message); | 864 DrawRemotePlaybackText(remote_playback_message); | 
| 847 is_remote_ = true; | 865 is_remote_ = true; | 
| 848 SetNeedsEstablishPeer(false); | 866 SetNeedsEstablishPeer(false); | 
| 849 } | 867 } | 
| (...skipping 871 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1721 player_manager_->EnterFullscreen(player_id_, frame_); | 1739 player_manager_->EnterFullscreen(player_id_, frame_); | 
| 1722 SetNeedsEstablishPeer(false); | 1740 SetNeedsEstablishPeer(false); | 
| 1723 } | 1741 } | 
| 1724 } | 1742 } | 
| 1725 | 1743 | 
| 1726 bool WebMediaPlayerAndroid::canEnterFullscreen() const { | 1744 bool WebMediaPlayerAndroid::canEnterFullscreen() const { | 
| 1727 return player_manager_->CanEnterFullscreen(frame_); | 1745 return player_manager_->CanEnterFullscreen(frame_); | 
| 1728 } | 1746 } | 
| 1729 | 1747 | 
| 1730 } // namespace content | 1748 } // namespace content | 
| OLD | NEW |