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 "webkit/renderer/media/android/webmediaplayer_android.h" | 5 #include "webkit/renderer/media/android/webmediaplayer_android.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
| 9 #include "base/files/file_path.h" | 9 #include "base/files/file_path.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 66 pending_seek_(0), | 66 pending_seek_(0), |
| 67 seeking_(false), | 67 seeking_(false), |
| 68 did_loading_progress_(false), | 68 did_loading_progress_(false), |
| 69 manager_(manager), | 69 manager_(manager), |
| 70 network_state_(WebMediaPlayer::NetworkStateEmpty), | 70 network_state_(WebMediaPlayer::NetworkStateEmpty), |
| 71 ready_state_(WebMediaPlayer::ReadyStateHaveNothing), | 71 ready_state_(WebMediaPlayer::ReadyStateHaveNothing), |
| 72 is_playing_(false), | 72 is_playing_(false), |
| 73 needs_establish_peer_(true), | 73 needs_establish_peer_(true), |
| 74 stream_texture_proxy_initialized_(false), | 74 stream_texture_proxy_initialized_(false), |
| 75 has_size_info_(false), | 75 has_size_info_(false), |
| 76 has_media_metadata_(false), | |
| 77 has_media_info_(false), | |
| 76 stream_texture_factory_(factory), | 78 stream_texture_factory_(factory), |
| 77 needs_external_surface_(false), | 79 needs_external_surface_(false), |
| 78 video_frame_provider_client_(NULL), | 80 video_frame_provider_client_(NULL), |
| 79 proxy_(proxy), | 81 proxy_(proxy), |
| 80 current_time_(0), | 82 current_time_(0), |
| 81 media_log_(media_log), | 83 media_log_(media_log), |
| 82 media_stream_client_(NULL) { | 84 media_stream_client_(NULL) { |
| 83 DCHECK(proxy_); | 85 DCHECK(proxy_); |
| 84 main_loop_->AddDestructionObserver(this); | 86 main_loop_->AddDestructionObserver(this); |
| 85 | 87 |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 143 #endif | 145 #endif |
| 144 } | 146 } |
| 145 | 147 |
| 146 void WebMediaPlayerAndroid::load(const WebURL& url, CORSMode cors_mode) { | 148 void WebMediaPlayerAndroid::load(const WebURL& url, CORSMode cors_mode) { |
| 147 load(url, NULL, cors_mode); | 149 load(url, NULL, cors_mode); |
| 148 } | 150 } |
| 149 | 151 |
| 150 void WebMediaPlayerAndroid::load(const WebURL& url, | 152 void WebMediaPlayerAndroid::load(const WebURL& url, |
| 151 WebMediaSource* media_source, | 153 WebMediaSource* media_source, |
| 152 CORSMode cors_mode) { | 154 CORSMode cors_mode) { |
| 153 if (cors_mode != CORSModeUnspecified) | |
| 154 NOTIMPLEMENTED() << "No CORS support"; | |
| 155 | |
| 156 MediaPlayerAndroid::SourceType source_type = | 155 MediaPlayerAndroid::SourceType source_type = |
| 157 MediaPlayerAndroid::SOURCE_TYPE_URL; | 156 MediaPlayerAndroid::SOURCE_TYPE_URL; |
| 157 url_ = url; | |
| 158 has_media_metadata_ = false; | |
| 159 has_media_info_ = false; | |
| 158 | 160 |
| 159 if (media_source) | 161 if (media_source) |
| 160 source_type = MediaPlayerAndroid::SOURCE_TYPE_MSE; | 162 source_type = MediaPlayerAndroid::SOURCE_TYPE_MSE; |
| 161 #if defined(GOOGLE_TV) | 163 #if defined(GOOGLE_TV) |
| 162 if (media_stream_client_) { | 164 if (media_stream_client_) { |
| 163 DCHECK(!media_source); | 165 DCHECK(!media_source); |
| 164 source_type = MediaPlayerAndroid::SOURCE_TYPE_STREAM; | 166 source_type = MediaPlayerAndroid::SOURCE_TYPE_STREAM; |
| 165 } | 167 } |
| 166 #endif | 168 #endif |
| 167 | 169 |
| 168 if (source_type != MediaPlayerAndroid::SOURCE_TYPE_URL) { | 170 if (source_type != MediaPlayerAndroid::SOURCE_TYPE_URL) { |
| 171 has_media_info_ = true; | |
| 169 media_source_delegate_.reset( | 172 media_source_delegate_.reset( |
| 170 new MediaSourceDelegate(proxy_, player_id_, media_log_)); | 173 new MediaSourceDelegate(proxy_, player_id_, media_log_)); |
| 171 // |media_source_delegate_| is owned, so Unretained() is safe here. | 174 // |media_source_delegate_| is owned, so Unretained() is safe here. |
| 172 if (source_type == MediaPlayerAndroid::SOURCE_TYPE_MSE) { | 175 if (source_type == MediaPlayerAndroid::SOURCE_TYPE_MSE) { |
| 173 media_source_delegate_->InitializeMediaSource( | 176 media_source_delegate_->InitializeMediaSource( |
| 174 media_source, | 177 media_source, |
| 175 base::Bind(&WebMediaPlayerAndroid::OnNeedKey, base::Unretained(this)), | 178 base::Bind(&WebMediaPlayerAndroid::OnNeedKey, base::Unretained(this)), |
| 176 base::Bind(&WebMediaPlayerAndroid::UpdateNetworkState, | 179 base::Bind(&WebMediaPlayerAndroid::UpdateNetworkState, |
| 177 base::Unretained(this))); | 180 base::Unretained(this))); |
| 178 } | 181 } |
| 179 #if defined(GOOGLE_TV) | 182 #if defined(GOOGLE_TV) |
| 180 if (source_type == MediaPlayerAndroid::SOURCE_TYPE_STREAM) { | 183 if (source_type == MediaPlayerAndroid::SOURCE_TYPE_STREAM) { |
| 181 media_source_delegate_->InitializeMediaStream( | 184 media_source_delegate_->InitializeMediaStream( |
| 182 demuxer_, | 185 demuxer_, |
| 183 base::Bind(&WebMediaPlayerAndroid::UpdateNetworkState, | 186 base::Bind(&WebMediaPlayerAndroid::UpdateNetworkState, |
| 184 base::Unretained(this))); | 187 base::Unretained(this))); |
| 185 audio_renderer_ = media_stream_client_->GetAudioRenderer(url); | 188 audio_renderer_ = media_stream_client_->GetAudioRenderer(url); |
| 186 if (audio_renderer_) | 189 if (audio_renderer_) |
| 187 audio_renderer_->Start(); | 190 audio_renderer_->Start(); |
| 188 } | 191 } |
| 189 #endif | 192 #endif |
| 193 } else { | |
| 194 info_loader_.reset( | |
| 195 new MediaInfoLoader( | |
| 196 url_, | |
| 197 cors_mode, | |
| 198 base::Bind(&WebMediaPlayerAndroid::DidLoadMediaInfo, | |
| 199 base::Unretained(this)))); | |
| 200 info_loader_->Start(frame_); | |
| 201 } | |
| 202 UpdateNetworkState(WebMediaPlayer::NetworkStateLoading); | |
| 203 UpdateReadyState(WebMediaPlayer::ReadyStateHaveNothing); | |
| 204 InitializeMediaPlayer(source_type); | |
| 205 } | |
| 206 | |
| 207 void WebMediaPlayerAndroid::DidLoadMediaInfo( | |
| 208 MediaInfoLoader::Status status) { | |
| 209 DCHECK(!media_source_delegate_); | |
| 210 if (status == MediaInfoLoader::kFailed) { | |
| 211 info_loader_.reset(); | |
| 212 UpdateNetworkState(WebMediaPlayer::NetworkStateNetworkError); | |
| 213 return; | |
| 190 } | 214 } |
| 191 | 215 |
| 192 InitializeMediaPlayer(url, source_type); | 216 has_media_info_ = true; |
| 217 if (has_media_metadata_ && | |
| 218 ready_state_ != WebMediaPlayer::ReadyStateHaveEnoughData) { | |
| 219 UpdateReadyState(WebMediaPlayer::ReadyStateHaveMetadata); | |
| 220 UpdateReadyState(WebMediaPlayer::ReadyStateHaveEnoughData); | |
| 221 } | |
| 193 } | 222 } |
| 194 | 223 |
| 195 void WebMediaPlayerAndroid::InitializeMediaPlayer( | 224 void WebMediaPlayerAndroid::InitializeMediaPlayer( |
| 196 const WebURL& url, | |
| 197 MediaPlayerAndroid::SourceType source_type) { | 225 MediaPlayerAndroid::SourceType source_type) { |
| 198 url_ = url; | |
| 199 GURL first_party_url = frame_->document().firstPartyForCookies(); | 226 GURL first_party_url = frame_->document().firstPartyForCookies(); |
| 200 proxy_->Initialize(player_id_, url, source_type, first_party_url); | 227 if (proxy_) { |
| 201 if (manager_->IsInFullscreen(frame_)) | 228 proxy_->Initialize(player_id_, url_, source_type, first_party_url); |
| 202 proxy_->EnterFullscreen(player_id_); | 229 if (manager_->IsInFullscreen(frame_)) |
| 203 | 230 proxy_->EnterFullscreen(player_id_); |
| 204 UpdateNetworkState(WebMediaPlayer::NetworkStateLoading); | 231 } |
| 205 UpdateReadyState(WebMediaPlayer::ReadyStateHaveNothing); | |
| 206 } | 232 } |
| 207 | 233 |
| 208 void WebMediaPlayerAndroid::play() { | 234 void WebMediaPlayerAndroid::play() { |
| 209 #if defined(GOOGLE_TV) | 235 #if defined(GOOGLE_TV) |
| 210 if (hasVideo() && needs_external_surface_) { | 236 if (hasVideo() && needs_external_surface_) { |
| 211 DCHECK(!needs_establish_peer_); | 237 DCHECK(!needs_establish_peer_); |
| 212 proxy_->RequestExternalSurface(player_id_, last_computed_rect_); | 238 proxy_->RequestExternalSurface(player_id_, last_computed_rect_); |
| 213 } | 239 } |
| 214 if (audio_renderer_ && paused()) | 240 if (audio_renderer_ && paused()) |
| 215 audio_renderer_->Play(); | 241 audio_renderer_->Play(); |
| (...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 367 web_graphics_context->copyTextureCHROMIUM(GL_TEXTURE_2D, texture_id_, | 393 web_graphics_context->copyTextureCHROMIUM(GL_TEXTURE_2D, texture_id_, |
| 368 texture, level, internal_format, | 394 texture, level, internal_format, |
| 369 type); | 395 type); |
| 370 web_graphics_context->pixelStorei(GL_UNPACK_FLIP_Y_CHROMIUM, false); | 396 web_graphics_context->pixelStorei(GL_UNPACK_FLIP_Y_CHROMIUM, false); |
| 371 web_graphics_context->pixelStorei(GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM, | 397 web_graphics_context->pixelStorei(GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM, |
| 372 false); | 398 false); |
| 373 return true; | 399 return true; |
| 374 } | 400 } |
| 375 | 401 |
| 376 bool WebMediaPlayerAndroid::hasSingleSecurityOrigin() const { | 402 bool WebMediaPlayerAndroid::hasSingleSecurityOrigin() const { |
| 377 // TODO(qinmin): fix this for urls that are not file. | 403 if (info_loader_) |
| 378 // https://code.google.com/p/chromium/issues/detail?id=234710 | 404 return info_loader_->HasSingleOrigin(); |
| 379 if (url_.SchemeIsFile()) | 405 return true; |
|
scherkus (not reviewing)
2013/06/12 01:37:58
do we need to worry about the case where info_load
Sami
2013/06/12 13:59:31
Yes, I'll add a check for that.
| |
| 380 return true; | 406 } |
| 407 | |
| 408 bool WebMediaPlayerAndroid::didPassCORSAccessCheck() const { | |
| 409 if (info_loader_) | |
| 410 return info_loader_->DidPassCORSAccessCheck(); | |
| 381 return false; | 411 return false; |
| 382 } | 412 } |
| 383 | 413 |
| 384 bool WebMediaPlayerAndroid::didPassCORSAccessCheck() const { | |
| 385 return false; | |
| 386 } | |
| 387 | |
| 388 double WebMediaPlayerAndroid::mediaTimeForTimeValue(double timeValue) const { | 414 double WebMediaPlayerAndroid::mediaTimeForTimeValue(double timeValue) const { |
| 389 return ConvertSecondsToTimestamp(timeValue).InSecondsF(); | 415 return ConvertSecondsToTimestamp(timeValue).InSecondsF(); |
| 390 } | 416 } |
| 391 | 417 |
| 392 unsigned WebMediaPlayerAndroid::decodedFrameCount() const { | 418 unsigned WebMediaPlayerAndroid::decodedFrameCount() const { |
| 393 if (media_source_delegate_) | 419 if (media_source_delegate_) |
| 394 return media_source_delegate_->DecodedFrameCount(); | 420 return media_source_delegate_->DecodedFrameCount(); |
| 395 NOTIMPLEMENTED(); | 421 NOTIMPLEMENTED(); |
| 396 return 0; | 422 return 0; |
| 397 } | 423 } |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 415 return media_source_delegate_->VideoDecodedByteCount(); | 441 return media_source_delegate_->VideoDecodedByteCount(); |
| 416 NOTIMPLEMENTED(); | 442 NOTIMPLEMENTED(); |
| 417 return 0; | 443 return 0; |
| 418 } | 444 } |
| 419 | 445 |
| 420 void WebMediaPlayerAndroid::OnMediaMetadataChanged( | 446 void WebMediaPlayerAndroid::OnMediaMetadataChanged( |
| 421 base::TimeDelta duration, int width, int height, bool success) { | 447 base::TimeDelta duration, int width, int height, bool success) { |
| 422 if (url_.SchemeIs("file")) | 448 if (url_.SchemeIs("file")) |
| 423 UpdateNetworkState(WebMediaPlayer::NetworkStateLoaded); | 449 UpdateNetworkState(WebMediaPlayer::NetworkStateLoaded); |
| 424 | 450 |
| 425 if (ready_state_ != WebMediaPlayer::ReadyStateHaveEnoughData) { | 451 has_media_metadata_ = true; |
| 452 if (has_media_info_ && | |
| 453 ready_state_ != WebMediaPlayer::ReadyStateHaveEnoughData) { | |
| 426 UpdateReadyState(WebMediaPlayer::ReadyStateHaveMetadata); | 454 UpdateReadyState(WebMediaPlayer::ReadyStateHaveMetadata); |
| 427 UpdateReadyState(WebMediaPlayer::ReadyStateHaveEnoughData); | 455 UpdateReadyState(WebMediaPlayer::ReadyStateHaveEnoughData); |
| 428 } | 456 } |
| 429 | 457 |
| 430 if (success) | 458 if (success) |
| 431 OnVideoSizeChanged(width, height); | 459 OnVideoSizeChanged(width, height); |
| 432 | 460 |
| 433 if (hasVideo() && !video_weblayer_ && client_->needsWebLayerForVideo()) { | 461 if (hasVideo() && !video_weblayer_ && client_->needsWebLayerForVideo()) { |
| 434 video_weblayer_.reset( | 462 video_weblayer_.reset( |
| 435 new webkit::WebLayerImpl(cc::VideoLayer::Create(this))); | 463 new webkit::WebLayerImpl(cc::VideoLayer::Create(this))); |
| (...skipping 589 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1025 | 1053 |
| 1026 void WebMediaPlayerAndroid::exitFullscreen() { | 1054 void WebMediaPlayerAndroid::exitFullscreen() { |
| 1027 proxy_->ExitFullscreen(player_id_); | 1055 proxy_->ExitFullscreen(player_id_); |
| 1028 } | 1056 } |
| 1029 | 1057 |
| 1030 bool WebMediaPlayerAndroid::canEnterFullscreen() const { | 1058 bool WebMediaPlayerAndroid::canEnterFullscreen() const { |
| 1031 return manager_->CanEnterFullscreen(frame_); | 1059 return manager_->CanEnterFullscreen(frame_); |
| 1032 } | 1060 } |
| 1033 | 1061 |
| 1034 } // namespace webkit_media | 1062 } // namespace webkit_media |
| OLD | NEW |