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

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

Issue 16327002: android: Implement single origin and CORS check for video (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fetch media info in parallel. Created 7 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 "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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698