| 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 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 71 pending_seek_(0), | 71 pending_seek_(0), |
| 72 seeking_(false), | 72 seeking_(false), |
| 73 did_loading_progress_(false), | 73 did_loading_progress_(false), |
| 74 manager_(manager), | 74 manager_(manager), |
| 75 network_state_(WebMediaPlayer::NetworkStateEmpty), | 75 network_state_(WebMediaPlayer::NetworkStateEmpty), |
| 76 ready_state_(WebMediaPlayer::ReadyStateHaveNothing), | 76 ready_state_(WebMediaPlayer::ReadyStateHaveNothing), |
| 77 is_playing_(false), | 77 is_playing_(false), |
| 78 needs_establish_peer_(true), | 78 needs_establish_peer_(true), |
| 79 stream_texture_proxy_initialized_(false), | 79 stream_texture_proxy_initialized_(false), |
| 80 has_size_info_(false), | 80 has_size_info_(false), |
| 81 has_media_metadata_(false), |
| 82 has_media_info_(false), |
| 81 stream_texture_factory_(factory), | 83 stream_texture_factory_(factory), |
| 82 needs_external_surface_(false), | 84 needs_external_surface_(false), |
| 83 video_frame_provider_client_(NULL), | 85 video_frame_provider_client_(NULL), |
| 84 source_type_(MediaPlayerAndroid::SOURCE_TYPE_URL), | 86 source_type_(MediaPlayerAndroid::SOURCE_TYPE_URL), |
| 85 proxy_(proxy), | 87 proxy_(proxy), |
| 86 current_time_(0), | 88 current_time_(0), |
| 87 media_log_(media_log), | 89 media_log_(media_log), |
| 88 media_stream_client_(NULL) { | 90 media_stream_client_(NULL) { |
| 89 DCHECK(proxy_); | 91 DCHECK(proxy_); |
| 90 | 92 |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 151 #endif | 153 #endif |
| 152 } | 154 } |
| 153 | 155 |
| 154 void WebMediaPlayerAndroid::load(const WebURL& url, CORSMode cors_mode) { | 156 void WebMediaPlayerAndroid::load(const WebURL& url, CORSMode cors_mode) { |
| 155 load(url, NULL, cors_mode); | 157 load(url, NULL, cors_mode); |
| 156 } | 158 } |
| 157 | 159 |
| 158 void WebMediaPlayerAndroid::load(const WebURL& url, | 160 void WebMediaPlayerAndroid::load(const WebURL& url, |
| 159 WebMediaSource* media_source, | 161 WebMediaSource* media_source, |
| 160 CORSMode cors_mode) { | 162 CORSMode cors_mode) { |
| 161 if (cors_mode != CORSModeUnspecified) | |
| 162 NOTIMPLEMENTED() << "No CORS support"; | |
| 163 | |
| 164 source_type_ = MediaPlayerAndroid::SOURCE_TYPE_URL; | 163 source_type_ = MediaPlayerAndroid::SOURCE_TYPE_URL; |
| 164 has_media_metadata_ = false; |
| 165 has_media_info_ = false; |
| 165 | 166 |
| 166 if (media_source) | 167 if (media_source) |
| 167 source_type_ = MediaPlayerAndroid::SOURCE_TYPE_MSE; | 168 source_type_ = MediaPlayerAndroid::SOURCE_TYPE_MSE; |
| 168 #if defined(GOOGLE_TV) | 169 #if defined(GOOGLE_TV) |
| 169 if (media_stream_client_) { | 170 if (media_stream_client_) { |
| 170 DCHECK(!media_source); | 171 DCHECK(!media_source); |
| 171 source_type_ = MediaPlayerAndroid::SOURCE_TYPE_STREAM; | 172 source_type_ = MediaPlayerAndroid::SOURCE_TYPE_STREAM; |
| 172 } | 173 } |
| 173 #endif | 174 #endif |
| 174 | 175 |
| 175 if (source_type_ != MediaPlayerAndroid::SOURCE_TYPE_URL) { | 176 if (source_type_ != MediaPlayerAndroid::SOURCE_TYPE_URL) { |
| 177 has_media_info_ = true; |
| 176 media_source_delegate_.reset( | 178 media_source_delegate_.reset( |
| 177 new MediaSourceDelegate(proxy_, player_id_, media_log_)); | 179 new MediaSourceDelegate(proxy_, player_id_, media_log_)); |
| 178 // |media_source_delegate_| is owned, so Unretained() is safe here. | 180 // |media_source_delegate_| is owned, so Unretained() is safe here. |
| 179 if (source_type_ == MediaPlayerAndroid::SOURCE_TYPE_MSE) { | 181 if (source_type_ == MediaPlayerAndroid::SOURCE_TYPE_MSE) { |
| 180 media_source_delegate_->InitializeMediaSource( | 182 media_source_delegate_->InitializeMediaSource( |
| 181 media_source, | 183 media_source, |
| 182 base::Bind(&WebMediaPlayerAndroid::OnNeedKey, base::Unretained(this)), | 184 base::Bind(&WebMediaPlayerAndroid::OnNeedKey, base::Unretained(this)), |
| 183 base::Bind(&WebMediaPlayerAndroid::UpdateNetworkState, | 185 base::Bind(&WebMediaPlayerAndroid::UpdateNetworkState, |
| 184 base::Unretained(this)), | 186 base::Unretained(this)), |
| 185 BIND_TO_RENDER_LOOP(&WebMediaPlayerAndroid::OnDurationChange)); | 187 BIND_TO_RENDER_LOOP(&WebMediaPlayerAndroid::OnDurationChange)); |
| 186 } | 188 } |
| 187 #if defined(GOOGLE_TV) | 189 #if defined(GOOGLE_TV) |
| 188 if (source_type_ == MediaPlayerAndroid::SOURCE_TYPE_STREAM) { | 190 if (source_type_ == MediaPlayerAndroid::SOURCE_TYPE_STREAM) { |
| 189 media_source_delegate_->InitializeMediaStream( | 191 media_source_delegate_->InitializeMediaStream( |
| 190 demuxer_, | 192 demuxer_, |
| 191 base::Bind(&WebMediaPlayerAndroid::UpdateNetworkState, | 193 base::Bind(&WebMediaPlayerAndroid::UpdateNetworkState, |
| 192 base::Unretained(this))); | 194 base::Unretained(this))); |
| 193 audio_renderer_ = media_stream_client_->GetAudioRenderer(url); | 195 audio_renderer_ = media_stream_client_->GetAudioRenderer(url); |
| 194 if (audio_renderer_) | 196 if (audio_renderer_) |
| 195 audio_renderer_->Start(); | 197 audio_renderer_->Start(); |
| 196 } | 198 } |
| 197 #endif | 199 #endif |
| 200 } else { |
| 201 info_loader_.reset( |
| 202 new MediaInfoLoader( |
| 203 url, |
| 204 cors_mode, |
| 205 base::Bind(&WebMediaPlayerAndroid::DidLoadMediaInfo, |
| 206 base::Unretained(this)))); |
| 207 info_loader_->Start(frame_); |
| 198 } | 208 } |
| 199 | 209 |
| 200 InitializeMediaPlayer(url); | 210 InitializeMediaPlayer(url); |
| 201 } | 211 } |
| 202 | 212 |
| 203 void WebMediaPlayerAndroid::InitializeMediaPlayer(const WebURL& url) { | 213 void WebMediaPlayerAndroid::InitializeMediaPlayer(const WebURL& url) { |
| 204 url_ = url; | 214 url_ = url; |
| 205 GURL first_party_url = frame_->document().firstPartyForCookies(); | 215 GURL first_party_url = frame_->document().firstPartyForCookies(); |
| 206 proxy_->Initialize(player_id_, url, source_type_, first_party_url); | 216 proxy_->Initialize(player_id_, url, source_type_, first_party_url); |
| 207 if (manager_->IsInFullscreen(frame_)) | 217 if (manager_->IsInFullscreen(frame_)) |
| 208 proxy_->EnterFullscreen(player_id_); | 218 proxy_->EnterFullscreen(player_id_); |
| 209 | 219 |
| 210 UpdateNetworkState(WebMediaPlayer::NetworkStateLoading); | 220 UpdateNetworkState(WebMediaPlayer::NetworkStateLoading); |
| 211 UpdateReadyState(WebMediaPlayer::ReadyStateHaveNothing); | 221 UpdateReadyState(WebMediaPlayer::ReadyStateHaveNothing); |
| 212 } | 222 } |
| 213 | 223 |
| 224 void WebMediaPlayerAndroid::DidLoadMediaInfo( |
| 225 MediaInfoLoader::Status status) { |
| 226 DCHECK(!media_source_delegate_); |
| 227 if (status == MediaInfoLoader::kFailed) { |
| 228 info_loader_.reset(); |
| 229 UpdateNetworkState(WebMediaPlayer::NetworkStateNetworkError); |
| 230 return; |
| 231 } |
| 232 |
| 233 has_media_info_ = true; |
| 234 if (has_media_metadata_ && |
| 235 ready_state_ != WebMediaPlayer::ReadyStateHaveEnoughData) { |
| 236 UpdateReadyState(WebMediaPlayer::ReadyStateHaveMetadata); |
| 237 UpdateReadyState(WebMediaPlayer::ReadyStateHaveEnoughData); |
| 238 } |
| 239 } |
| 240 |
| 214 void WebMediaPlayerAndroid::play() { | 241 void WebMediaPlayerAndroid::play() { |
| 215 #if defined(GOOGLE_TV) | 242 #if defined(GOOGLE_TV) |
| 216 if (hasVideo() && needs_external_surface_) { | 243 if (hasVideo() && needs_external_surface_) { |
| 217 DCHECK(!needs_establish_peer_); | 244 DCHECK(!needs_establish_peer_); |
| 218 proxy_->RequestExternalSurface(player_id_, last_computed_rect_); | 245 proxy_->RequestExternalSurface(player_id_, last_computed_rect_); |
| 219 } | 246 } |
| 220 if (audio_renderer_ && paused()) | 247 if (audio_renderer_ && paused()) |
| 221 audio_renderer_->Play(); | 248 audio_renderer_->Play(); |
| 222 #endif | 249 #endif |
| 223 if (hasVideo() && needs_establish_peer_) | 250 if (hasVideo() && needs_establish_peer_) |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 385 web_graphics_context->copyTextureCHROMIUM(GL_TEXTURE_2D, texture_id_, | 412 web_graphics_context->copyTextureCHROMIUM(GL_TEXTURE_2D, texture_id_, |
| 386 texture, level, internal_format, | 413 texture, level, internal_format, |
| 387 type); | 414 type); |
| 388 web_graphics_context->pixelStorei(GL_UNPACK_FLIP_Y_CHROMIUM, false); | 415 web_graphics_context->pixelStorei(GL_UNPACK_FLIP_Y_CHROMIUM, false); |
| 389 web_graphics_context->pixelStorei(GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM, | 416 web_graphics_context->pixelStorei(GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM, |
| 390 false); | 417 false); |
| 391 return true; | 418 return true; |
| 392 } | 419 } |
| 393 | 420 |
| 394 bool WebMediaPlayerAndroid::hasSingleSecurityOrigin() const { | 421 bool WebMediaPlayerAndroid::hasSingleSecurityOrigin() const { |
| 395 // TODO(qinmin): fix this for urls that are not file. | 422 if (info_loader_) |
| 396 // https://code.google.com/p/chromium/issues/detail?id=234710 | 423 return info_loader_->HasSingleOrigin(); |
| 397 if (url_.SchemeIsFile()) | 424 // The info loader may have failed. |
| 398 return true; | 425 if (source_type_ == MediaPlayerAndroid::SOURCE_TYPE_URL) |
| 426 return false; |
| 427 return true; |
| 428 } |
| 429 |
| 430 bool WebMediaPlayerAndroid::didPassCORSAccessCheck() const { |
| 431 if (info_loader_) |
| 432 return info_loader_->DidPassCORSAccessCheck(); |
| 399 return false; | 433 return false; |
| 400 } | 434 } |
| 401 | 435 |
| 402 bool WebMediaPlayerAndroid::didPassCORSAccessCheck() const { | |
| 403 return false; | |
| 404 } | |
| 405 | |
| 406 double WebMediaPlayerAndroid::mediaTimeForTimeValue(double timeValue) const { | 436 double WebMediaPlayerAndroid::mediaTimeForTimeValue(double timeValue) const { |
| 407 return ConvertSecondsToTimestamp(timeValue).InSecondsF(); | 437 return ConvertSecondsToTimestamp(timeValue).InSecondsF(); |
| 408 } | 438 } |
| 409 | 439 |
| 410 unsigned WebMediaPlayerAndroid::decodedFrameCount() const { | 440 unsigned WebMediaPlayerAndroid::decodedFrameCount() const { |
| 411 if (media_source_delegate_) | 441 if (media_source_delegate_) |
| 412 return media_source_delegate_->DecodedFrameCount(); | 442 return media_source_delegate_->DecodedFrameCount(); |
| 413 NOTIMPLEMENTED(); | 443 NOTIMPLEMENTED(); |
| 414 return 0; | 444 return 0; |
| 415 } | 445 } |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 454 // already triggers a durationchanged event. If this is a different | 484 // already triggers a durationchanged event. If this is a different |
| 455 // transition, remember to signal durationchanged. | 485 // transition, remember to signal durationchanged. |
| 456 // Do not ever signal durationchanged on metadata change in MSE case | 486 // Do not ever signal durationchanged on metadata change in MSE case |
| 457 // because OnDurationChange() handles this. | 487 // because OnDurationChange() handles this. |
| 458 if (ready_state_ > WebMediaPlayer::ReadyStateHaveNothing && | 488 if (ready_state_ > WebMediaPlayer::ReadyStateHaveNothing && |
| 459 source_type_ != MediaPlayerAndroid::SOURCE_TYPE_MSE) { | 489 source_type_ != MediaPlayerAndroid::SOURCE_TYPE_MSE) { |
| 460 need_to_signal_duration_changed = true; | 490 need_to_signal_duration_changed = true; |
| 461 } | 491 } |
| 462 } | 492 } |
| 463 | 493 |
| 464 if (ready_state_ != WebMediaPlayer::ReadyStateHaveEnoughData) { | 494 has_media_metadata_ = true; |
| 495 if (has_media_info_ && |
| 496 ready_state_ != WebMediaPlayer::ReadyStateHaveEnoughData) { |
| 465 UpdateReadyState(WebMediaPlayer::ReadyStateHaveMetadata); | 497 UpdateReadyState(WebMediaPlayer::ReadyStateHaveMetadata); |
| 466 UpdateReadyState(WebMediaPlayer::ReadyStateHaveEnoughData); | 498 UpdateReadyState(WebMediaPlayer::ReadyStateHaveEnoughData); |
| 467 } | 499 } |
| 468 | 500 |
| 469 // TODO(wolenetz): Should we just abort early and set network state to an | 501 // TODO(wolenetz): Should we just abort early and set network state to an |
| 470 // error if success == false? See http://crbug.com/248399 | 502 // error if success == false? See http://crbug.com/248399 |
| 471 if (success) | 503 if (success) |
| 472 OnVideoSizeChanged(width, height); | 504 OnVideoSizeChanged(width, height); |
| 473 | 505 |
| 474 if (hasVideo() && !video_weblayer_ && client_->needsWebLayerForVideo()) { | 506 if (hasVideo() && !video_weblayer_ && client_->needsWebLayerForVideo()) { |
| (...skipping 607 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1082 | 1114 |
| 1083 void WebMediaPlayerAndroid::exitFullscreen() { | 1115 void WebMediaPlayerAndroid::exitFullscreen() { |
| 1084 proxy_->ExitFullscreen(player_id_); | 1116 proxy_->ExitFullscreen(player_id_); |
| 1085 } | 1117 } |
| 1086 | 1118 |
| 1087 bool WebMediaPlayerAndroid::canEnterFullscreen() const { | 1119 bool WebMediaPlayerAndroid::canEnterFullscreen() const { |
| 1088 return manager_->CanEnterFullscreen(frame_); | 1120 return manager_->CanEnterFullscreen(frame_); |
| 1089 } | 1121 } |
| 1090 | 1122 |
| 1091 } // namespace webkit_media | 1123 } // namespace webkit_media |
| OLD | NEW |