| 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/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| (...skipping 29 matching lines...) Expand all Loading... |
| 40 #include "ui/gfx/image/image.h" | 40 #include "ui/gfx/image/image.h" |
| 41 #include "webkit/renderer/compositor_bindings/web_layer_impl.h" | 41 #include "webkit/renderer/compositor_bindings/web_layer_impl.h" |
| 42 | 42 |
| 43 #if defined(GOOGLE_TV) | 43 #if defined(GOOGLE_TV) |
| 44 #include "content/renderer/media/media_stream_audio_renderer.h" | 44 #include "content/renderer/media/media_stream_audio_renderer.h" |
| 45 #include "content/renderer/media/media_stream_client.h" | 45 #include "content/renderer/media/media_stream_client.h" |
| 46 #endif | 46 #endif |
| 47 | 47 |
| 48 static const uint32 kGLTextureExternalOES = 0x8D65; | 48 static const uint32 kGLTextureExternalOES = 0x8D65; |
| 49 | 49 |
| 50 using WebKit::WebMediaPlayer; | 50 using blink::WebMediaPlayer; |
| 51 using WebKit::WebSize; | 51 using blink::WebSize; |
| 52 using WebKit::WebString; | 52 using blink::WebString; |
| 53 using WebKit::WebTimeRanges; | 53 using blink::WebTimeRanges; |
| 54 using WebKit::WebURL; | 54 using blink::WebURL; |
| 55 using media::MediaPlayerAndroid; | 55 using media::MediaPlayerAndroid; |
| 56 using media::VideoFrame; | 56 using media::VideoFrame; |
| 57 | 57 |
| 58 namespace { | 58 namespace { |
| 59 // Prefix for histograms related to Encrypted Media Extensions. | 59 // Prefix for histograms related to Encrypted Media Extensions. |
| 60 const char* kMediaEme = "Media.EME."; | 60 const char* kMediaEme = "Media.EME."; |
| 61 } // namespace | 61 } // namespace |
| 62 | 62 |
| 63 namespace content { | 63 namespace content { |
| 64 | 64 |
| 65 // static | 65 // static |
| 66 void WebMediaPlayerAndroid::OnReleaseRemotePlaybackTexture( | 66 void WebMediaPlayerAndroid::OnReleaseRemotePlaybackTexture( |
| 67 const scoped_refptr<base::MessageLoopProxy>& main_loop, | 67 const scoped_refptr<base::MessageLoopProxy>& main_loop, |
| 68 const base::WeakPtr<WebMediaPlayerAndroid>& player, | 68 const base::WeakPtr<WebMediaPlayerAndroid>& player, |
| 69 uint32 sync_point) { | 69 uint32 sync_point) { |
| 70 main_loop->PostTask( | 70 main_loop->PostTask( |
| 71 FROM_HERE, | 71 FROM_HERE, |
| 72 base::Bind(&WebMediaPlayerAndroid::DoReleaseRemotePlaybackTexture, | 72 base::Bind(&WebMediaPlayerAndroid::DoReleaseRemotePlaybackTexture, |
| 73 player, | 73 player, |
| 74 sync_point)); | 74 sync_point)); |
| 75 } | 75 } |
| 76 | 76 |
| 77 WebMediaPlayerAndroid::WebMediaPlayerAndroid( | 77 WebMediaPlayerAndroid::WebMediaPlayerAndroid( |
| 78 WebKit::WebFrame* frame, | 78 blink::WebFrame* frame, |
| 79 WebKit::WebMediaPlayerClient* client, | 79 blink::WebMediaPlayerClient* client, |
| 80 base::WeakPtr<WebMediaPlayerDelegate> delegate, | 80 base::WeakPtr<WebMediaPlayerDelegate> delegate, |
| 81 RendererMediaPlayerManager* manager, | 81 RendererMediaPlayerManager* manager, |
| 82 StreamTextureFactory* factory, | 82 StreamTextureFactory* factory, |
| 83 const scoped_refptr<base::MessageLoopProxy>& media_loop, | 83 const scoped_refptr<base::MessageLoopProxy>& media_loop, |
| 84 media::MediaLog* media_log) | 84 media::MediaLog* media_log) |
| 85 : frame_(frame), | 85 : frame_(frame), |
| 86 client_(client), | 86 client_(client), |
| 87 delegate_(delegate), | 87 delegate_(delegate), |
| 88 buffered_(1u), | 88 buffered_(1u), |
| 89 main_loop_(base::MessageLoopProxy::current()), | 89 main_loop_(base::MessageLoopProxy::current()), |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 140 } | 140 } |
| 141 } | 141 } |
| 142 | 142 |
| 143 // Defer stream texture creation until we are sure it's necessary. | 143 // Defer stream texture creation until we are sure it's necessary. |
| 144 stream_id_ = 0; | 144 stream_id_ = 0; |
| 145 needs_establish_peer_ = false; | 145 needs_establish_peer_ = false; |
| 146 current_frame_ = VideoFrame::CreateBlackFrame(gfx::Size(1, 1)); | 146 current_frame_ = VideoFrame::CreateBlackFrame(gfx::Size(1, 1)); |
| 147 #endif | 147 #endif |
| 148 TryCreateStreamTextureProxyIfNeeded(); | 148 TryCreateStreamTextureProxyIfNeeded(); |
| 149 | 149 |
| 150 if (WebKit::WebRuntimeFeatures::isPrefixedEncryptedMediaEnabled()) { | 150 if (blink::WebRuntimeFeatures::isPrefixedEncryptedMediaEnabled()) { |
| 151 // TODO(xhwang): Report an error when there is encrypted stream but EME is | 151 // TODO(xhwang): Report an error when there is encrypted stream but EME is |
| 152 // not enabled. Currently the player just doesn't start and waits for ever. | 152 // not enabled. Currently the player just doesn't start and waits for ever. |
| 153 decryptor_.reset(new ProxyDecryptor( | 153 decryptor_.reset(new ProxyDecryptor( |
| 154 #if defined(ENABLE_PEPPER_CDMS) | 154 #if defined(ENABLE_PEPPER_CDMS) |
| 155 client, | 155 client, |
| 156 frame, | 156 frame, |
| 157 #else | 157 #else |
| 158 manager_, | 158 manager_, |
| 159 player_id_, // TODO(xhwang): Use media_keys_id when MediaKeys are | 159 player_id_, // TODO(xhwang): Use media_keys_id when MediaKeys are |
| 160 // separated from WebMediaPlayer. | 160 // separated from WebMediaPlayer. |
| (...skipping 12 matching lines...) Expand all Loading... |
| 173 | 173 |
| 174 if (manager_) { | 174 if (manager_) { |
| 175 manager_->DestroyPlayer(player_id_); | 175 manager_->DestroyPlayer(player_id_); |
| 176 manager_->UnregisterMediaPlayer(player_id_); | 176 manager_->UnregisterMediaPlayer(player_id_); |
| 177 } | 177 } |
| 178 | 178 |
| 179 if (stream_id_) | 179 if (stream_id_) |
| 180 stream_texture_factory_->DestroyStreamTexture(texture_id_); | 180 stream_texture_factory_->DestroyStreamTexture(texture_id_); |
| 181 | 181 |
| 182 if (remote_playback_texture_id_) { | 182 if (remote_playback_texture_id_) { |
| 183 WebKit::WebGraphicsContext3D* context = | 183 blink::WebGraphicsContext3D* context = |
| 184 stream_texture_factory_->Context3d(); | 184 stream_texture_factory_->Context3d(); |
| 185 if (context->makeContextCurrent()) | 185 if (context->makeContextCurrent()) |
| 186 context->deleteTexture(remote_playback_texture_id_); | 186 context->deleteTexture(remote_playback_texture_id_); |
| 187 } | 187 } |
| 188 | 188 |
| 189 if (base::MessageLoop::current()) | 189 if (base::MessageLoop::current()) |
| 190 base::MessageLoop::current()->RemoveDestructionObserver(this); | 190 base::MessageLoop::current()->RemoveDestructionObserver(this); |
| 191 | 191 |
| 192 if (player_type_ == MEDIA_PLAYER_TYPE_MEDIA_SOURCE && delegate_) | 192 if (player_type_ == MEDIA_PLAYER_TYPE_MEDIA_SOURCE && delegate_) |
| 193 delegate_->PlayerGone(this); | 193 delegate_->PlayerGone(this); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 205 } | 205 } |
| 206 } | 206 } |
| 207 if (demuxer_ && !destroy_demuxer_cb_.is_null()) { | 207 if (demuxer_ && !destroy_demuxer_cb_.is_null()) { |
| 208 media_source_delegate_.reset(); | 208 media_source_delegate_.reset(); |
| 209 destroy_demuxer_cb_.Run(); | 209 destroy_demuxer_cb_.Run(); |
| 210 } | 210 } |
| 211 #endif | 211 #endif |
| 212 } | 212 } |
| 213 | 213 |
| 214 void WebMediaPlayerAndroid::load(LoadType load_type, | 214 void WebMediaPlayerAndroid::load(LoadType load_type, |
| 215 const WebKit::WebURL& url, | 215 const blink::WebURL& url, |
| 216 CORSMode cors_mode) { | 216 CORSMode cors_mode) { |
| 217 switch (load_type) { | 217 switch (load_type) { |
| 218 case LoadTypeURL: | 218 case LoadTypeURL: |
| 219 player_type_ = MEDIA_PLAYER_TYPE_URL; | 219 player_type_ = MEDIA_PLAYER_TYPE_URL; |
| 220 break; | 220 break; |
| 221 | 221 |
| 222 case LoadTypeMediaSource: | 222 case LoadTypeMediaSource: |
| 223 player_type_ = MEDIA_PLAYER_TYPE_MEDIA_SOURCE; | 223 player_type_ = MEDIA_PLAYER_TYPE_MEDIA_SOURCE; |
| 224 break; | 224 break; |
| 225 | 225 |
| (...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 501 // TODO(hclam): If this stream is not seekable this should return 0. | 501 // TODO(hclam): If this stream is not seekable this should return 0. |
| 502 return duration(); | 502 return duration(); |
| 503 } | 503 } |
| 504 | 504 |
| 505 bool WebMediaPlayerAndroid::didLoadingProgress() const { | 505 bool WebMediaPlayerAndroid::didLoadingProgress() const { |
| 506 bool ret = did_loading_progress_; | 506 bool ret = did_loading_progress_; |
| 507 did_loading_progress_ = false; | 507 did_loading_progress_ = false; |
| 508 return ret; | 508 return ret; |
| 509 } | 509 } |
| 510 | 510 |
| 511 void WebMediaPlayerAndroid::paint(WebKit::WebCanvas* canvas, | 511 void WebMediaPlayerAndroid::paint(blink::WebCanvas* canvas, |
| 512 const WebKit::WebRect& rect, | 512 const blink::WebRect& rect, |
| 513 unsigned char alpha) { | 513 unsigned char alpha) { |
| 514 NOTIMPLEMENTED(); | 514 NOTIMPLEMENTED(); |
| 515 } | 515 } |
| 516 | 516 |
| 517 bool WebMediaPlayerAndroid::copyVideoTextureToPlatformTexture( | 517 bool WebMediaPlayerAndroid::copyVideoTextureToPlatformTexture( |
| 518 WebKit::WebGraphicsContext3D* web_graphics_context, | 518 blink::WebGraphicsContext3D* web_graphics_context, |
| 519 unsigned int texture, | 519 unsigned int texture, |
| 520 unsigned int level, | 520 unsigned int level, |
| 521 unsigned int internal_format, | 521 unsigned int internal_format, |
| 522 unsigned int type, | 522 unsigned int type, |
| 523 bool premultiply_alpha, | 523 bool premultiply_alpha, |
| 524 bool flip_y) { | 524 bool flip_y) { |
| 525 if (is_remote_ || !texture_id_) | 525 if (is_remote_ || !texture_id_) |
| 526 return false; | 526 return false; |
| 527 | 527 |
| 528 // For hidden video element (with style "display:none"), ensure the texture | 528 // For hidden video element (with style "display:none"), ensure the texture |
| (...skipping 372 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 901 current_frame_ = NULL; | 901 current_frame_ = NULL; |
| 902 } | 902 } |
| 903 is_remote_ = false; | 903 is_remote_ = false; |
| 904 manager_ = NULL; | 904 manager_ = NULL; |
| 905 } | 905 } |
| 906 | 906 |
| 907 void WebMediaPlayerAndroid::DrawRemotePlaybackIcon() { | 907 void WebMediaPlayerAndroid::DrawRemotePlaybackIcon() { |
| 908 DCHECK(main_thread_checker_.CalledOnValidThread()); | 908 DCHECK(main_thread_checker_.CalledOnValidThread()); |
| 909 if (!video_weblayer_) | 909 if (!video_weblayer_) |
| 910 return; | 910 return; |
| 911 WebKit::WebGraphicsContext3D* context = stream_texture_factory_->Context3d(); | 911 blink::WebGraphicsContext3D* context = stream_texture_factory_->Context3d(); |
| 912 if (!context->makeContextCurrent()) | 912 if (!context->makeContextCurrent()) |
| 913 return; | 913 return; |
| 914 | 914 |
| 915 // TODO(johnme): Should redraw this frame if the layer bounds change; but | 915 // TODO(johnme): Should redraw this frame if the layer bounds change; but |
| 916 // there seems no easy way to listen for the layer resizing (as opposed to | 916 // there seems no easy way to listen for the layer resizing (as opposed to |
| 917 // OnVideoSizeChanged, which is when the frame sizes of the video file | 917 // OnVideoSizeChanged, which is when the frame sizes of the video file |
| 918 // change). Perhaps have to poll (on main thread of course)? | 918 // change). Perhaps have to poll (on main thread of course)? |
| 919 gfx::Size video_size_css_px = video_weblayer_->bounds(); | 919 gfx::Size video_size_css_px = video_weblayer_->bounds(); |
| 920 float device_scale_factor = frame_->view()->deviceScaleFactor(); | 920 float device_scale_factor = frame_->view()->deviceScaleFactor(); |
| 921 // canvas_size will be the size in device pixels when pageScaleFactor == 1 | 921 // canvas_size will be the size in device pixels when pageScaleFactor == 1 |
| (...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1164 // The following EME related code is copied from WebMediaPlayerImpl. | 1164 // The following EME related code is copied from WebMediaPlayerImpl. |
| 1165 // TODO(xhwang): Remove duplicate code between WebMediaPlayerAndroid and | 1165 // TODO(xhwang): Remove duplicate code between WebMediaPlayerAndroid and |
| 1166 // WebMediaPlayerImpl. | 1166 // WebMediaPlayerImpl. |
| 1167 // TODO(kjyoun): Update Google TV EME implementation to use IPC. | 1167 // TODO(kjyoun): Update Google TV EME implementation to use IPC. |
| 1168 | 1168 |
| 1169 // Helper functions to report media EME related stats to UMA. They follow the | 1169 // Helper functions to report media EME related stats to UMA. They follow the |
| 1170 // convention of more commonly used macros UMA_HISTOGRAM_ENUMERATION and | 1170 // convention of more commonly used macros UMA_HISTOGRAM_ENUMERATION and |
| 1171 // UMA_HISTOGRAM_COUNTS. The reason that we cannot use those macros directly is | 1171 // UMA_HISTOGRAM_COUNTS. The reason that we cannot use those macros directly is |
| 1172 // that UMA_* macros require the names to be constant throughout the process' | 1172 // that UMA_* macros require the names to be constant throughout the process' |
| 1173 // lifetime. | 1173 // lifetime. |
| 1174 static void EmeUMAHistogramEnumeration(const WebKit::WebString& key_system, | 1174 static void EmeUMAHistogramEnumeration(const blink::WebString& key_system, |
| 1175 const std::string& method, | 1175 const std::string& method, |
| 1176 int sample, | 1176 int sample, |
| 1177 int boundary_value) { | 1177 int boundary_value) { |
| 1178 base::LinearHistogram::FactoryGet( | 1178 base::LinearHistogram::FactoryGet( |
| 1179 kMediaEme + KeySystemNameForUMA(key_system) + "." + method, | 1179 kMediaEme + KeySystemNameForUMA(key_system) + "." + method, |
| 1180 1, boundary_value, boundary_value + 1, | 1180 1, boundary_value, boundary_value + 1, |
| 1181 base::Histogram::kUmaTargetedHistogramFlag)->Add(sample); | 1181 base::Histogram::kUmaTargetedHistogramFlag)->Add(sample); |
| 1182 } | 1182 } |
| 1183 | 1183 |
| 1184 static void EmeUMAHistogramCounts(const WebKit::WebString& key_system, | 1184 static void EmeUMAHistogramCounts(const blink::WebString& key_system, |
| 1185 const std::string& method, | 1185 const std::string& method, |
| 1186 int sample) { | 1186 int sample) { |
| 1187 // Use the same parameters as UMA_HISTOGRAM_COUNTS. | 1187 // Use the same parameters as UMA_HISTOGRAM_COUNTS. |
| 1188 base::Histogram::FactoryGet( | 1188 base::Histogram::FactoryGet( |
| 1189 kMediaEme + KeySystemNameForUMA(key_system) + "." + method, | 1189 kMediaEme + KeySystemNameForUMA(key_system) + "." + method, |
| 1190 1, 1000000, 50, base::Histogram::kUmaTargetedHistogramFlag)->Add(sample); | 1190 1, 1000000, 50, base::Histogram::kUmaTargetedHistogramFlag)->Add(sample); |
| 1191 } | 1191 } |
| 1192 | 1192 |
| 1193 // Helper enum for reporting generateKeyRequest/addKey histograms. | 1193 // Helper enum for reporting generateKeyRequest/addKey histograms. |
| 1194 enum MediaKeyException { | 1194 enum MediaKeyException { |
| (...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1344 | 1344 |
| 1345 void WebMediaPlayerAndroid::OnKeyError(const std::string& session_id, | 1345 void WebMediaPlayerAndroid::OnKeyError(const std::string& session_id, |
| 1346 media::MediaKeys::KeyError error_code, | 1346 media::MediaKeys::KeyError error_code, |
| 1347 int system_code) { | 1347 int system_code) { |
| 1348 EmeUMAHistogramEnumeration(current_key_system_, "KeyError", | 1348 EmeUMAHistogramEnumeration(current_key_system_, "KeyError", |
| 1349 error_code, media::MediaKeys::kMaxKeyError); | 1349 error_code, media::MediaKeys::kMaxKeyError); |
| 1350 | 1350 |
| 1351 client_->keyError( | 1351 client_->keyError( |
| 1352 current_key_system_, | 1352 current_key_system_, |
| 1353 WebString::fromUTF8(session_id), | 1353 WebString::fromUTF8(session_id), |
| 1354 static_cast<WebKit::WebMediaPlayerClient::MediaKeyErrorCode>(error_code), | 1354 static_cast<blink::WebMediaPlayerClient::MediaKeyErrorCode>(error_code), |
| 1355 system_code); | 1355 system_code); |
| 1356 } | 1356 } |
| 1357 | 1357 |
| 1358 void WebMediaPlayerAndroid::OnKeyMessage(const std::string& session_id, | 1358 void WebMediaPlayerAndroid::OnKeyMessage(const std::string& session_id, |
| 1359 const std::vector<uint8>& message, | 1359 const std::vector<uint8>& message, |
| 1360 const std::string& destination_url) { | 1360 const std::string& destination_url) { |
| 1361 const GURL destination_url_gurl(destination_url); | 1361 const GURL destination_url_gurl(destination_url); |
| 1362 DLOG_IF(WARNING, !destination_url.empty() && !destination_url_gurl.is_valid()) | 1362 DLOG_IF(WARNING, !destination_url.empty() && !destination_url_gurl.is_valid()) |
| 1363 << "Invalid URL in destination_url: " << destination_url; | 1363 << "Invalid URL in destination_url: " << destination_url; |
| 1364 | 1364 |
| 1365 client_->keyMessage(current_key_system_, | 1365 client_->keyMessage(current_key_system_, |
| 1366 WebString::fromUTF8(session_id), | 1366 WebString::fromUTF8(session_id), |
| 1367 message.empty() ? NULL : &message[0], | 1367 message.empty() ? NULL : &message[0], |
| 1368 message.size(), | 1368 message.size(), |
| 1369 destination_url_gurl); | 1369 destination_url_gurl); |
| 1370 } | 1370 } |
| 1371 | 1371 |
| 1372 void WebMediaPlayerAndroid::OnMediaSourceOpened( | 1372 void WebMediaPlayerAndroid::OnMediaSourceOpened( |
| 1373 WebKit::WebMediaSource* web_media_source) { | 1373 blink::WebMediaSource* web_media_source) { |
| 1374 client_->mediaSourceOpened(web_media_source); | 1374 client_->mediaSourceOpened(web_media_source); |
| 1375 } | 1375 } |
| 1376 | 1376 |
| 1377 void WebMediaPlayerAndroid::OnNeedKey(const std::string& type, | 1377 void WebMediaPlayerAndroid::OnNeedKey(const std::string& type, |
| 1378 const std::vector<uint8>& init_data) { | 1378 const std::vector<uint8>& init_data) { |
| 1379 DCHECK(main_loop_->BelongsToCurrentThread()); | 1379 DCHECK(main_loop_->BelongsToCurrentThread()); |
| 1380 // Do not fire NeedKey event if encrypted media is not enabled. | 1380 // Do not fire NeedKey event if encrypted media is not enabled. |
| 1381 if (!WebKit::WebRuntimeFeatures::isEncryptedMediaEnabled() && | 1381 if (!blink::WebRuntimeFeatures::isEncryptedMediaEnabled() && |
| 1382 !WebKit::WebRuntimeFeatures::isPrefixedEncryptedMediaEnabled()) { | 1382 !blink::WebRuntimeFeatures::isPrefixedEncryptedMediaEnabled()) { |
| 1383 return; | 1383 return; |
| 1384 } | 1384 } |
| 1385 | 1385 |
| 1386 UMA_HISTOGRAM_COUNTS(kMediaEme + std::string("NeedKey"), 1); | 1386 UMA_HISTOGRAM_COUNTS(kMediaEme + std::string("NeedKey"), 1); |
| 1387 | 1387 |
| 1388 DCHECK(init_data_type_.empty() || type.empty() || type == init_data_type_); | 1388 DCHECK(init_data_type_.empty() || type.empty() || type == init_data_type_); |
| 1389 if (init_data_type_.empty()) | 1389 if (init_data_type_.empty()) |
| 1390 init_data_type_ = type; | 1390 init_data_type_ = type; |
| 1391 | 1391 |
| 1392 const uint8* init_data_ptr = init_data.empty() ? NULL : &init_data[0]; | 1392 const uint8* init_data_ptr = init_data.empty() ? NULL : &init_data[0]; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1407 demuxer_ = demuxer; | 1407 demuxer_ = demuxer; |
| 1408 destroy_demuxer_cb_ = destroy_demuxer_cb; | 1408 destroy_demuxer_cb_ = destroy_demuxer_cb; |
| 1409 return true; | 1409 return true; |
| 1410 } | 1410 } |
| 1411 #endif | 1411 #endif |
| 1412 | 1412 |
| 1413 void WebMediaPlayerAndroid::DoReleaseRemotePlaybackTexture(uint32 sync_point) { | 1413 void WebMediaPlayerAndroid::DoReleaseRemotePlaybackTexture(uint32 sync_point) { |
| 1414 DCHECK(main_thread_checker_.CalledOnValidThread()); | 1414 DCHECK(main_thread_checker_.CalledOnValidThread()); |
| 1415 DCHECK(remote_playback_texture_id_); | 1415 DCHECK(remote_playback_texture_id_); |
| 1416 | 1416 |
| 1417 WebKit::WebGraphicsContext3D* context = | 1417 blink::WebGraphicsContext3D* context = |
| 1418 stream_texture_factory_->Context3d(); | 1418 stream_texture_factory_->Context3d(); |
| 1419 | 1419 |
| 1420 if (sync_point) | 1420 if (sync_point) |
| 1421 context->waitSyncPoint(sync_point); | 1421 context->waitSyncPoint(sync_point); |
| 1422 context->deleteTexture(remote_playback_texture_id_); | 1422 context->deleteTexture(remote_playback_texture_id_); |
| 1423 remote_playback_texture_id_ = 0; | 1423 remote_playback_texture_id_ = 0; |
| 1424 } | 1424 } |
| 1425 | 1425 |
| 1426 void WebMediaPlayerAndroid::enterFullscreen() { | 1426 void WebMediaPlayerAndroid::enterFullscreen() { |
| 1427 if (manager_->CanEnterFullscreen(frame_)) { | 1427 if (manager_->CanEnterFullscreen(frame_)) { |
| 1428 manager_->EnterFullscreen(player_id_); | 1428 manager_->EnterFullscreen(player_id_); |
| 1429 SetNeedsEstablishPeer(false); | 1429 SetNeedsEstablishPeer(false); |
| 1430 } | 1430 } |
| 1431 } | 1431 } |
| 1432 | 1432 |
| 1433 void WebMediaPlayerAndroid::exitFullscreen() { | 1433 void WebMediaPlayerAndroid::exitFullscreen() { |
| 1434 manager_->ExitFullscreen(player_id_); | 1434 manager_->ExitFullscreen(player_id_); |
| 1435 } | 1435 } |
| 1436 | 1436 |
| 1437 bool WebMediaPlayerAndroid::canEnterFullscreen() const { | 1437 bool WebMediaPlayerAndroid::canEnterFullscreen() const { |
| 1438 return manager_->CanEnterFullscreen(frame_); | 1438 return manager_->CanEnterFullscreen(frame_); |
| 1439 } | 1439 } |
| 1440 | 1440 |
| 1441 } // namespace content | 1441 } // namespace content |
| OLD | NEW |