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

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

Issue 1212823003: Recover from timing problem at exit of video-fullscreen (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebased and removed trailing blank line Created 5 years, 5 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
« no previous file with comments | « content/renderer/media/android/webmediaplayer_android.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "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 934 matching lines...) Expand 10 before | Expand all | Expand 10 after
945 ReallocateVideoFrame(); 945 ReallocateVideoFrame();
946 client_->disconnectedFromRemoteDevice(); 946 client_->disconnectedFromRemoteDevice();
947 } 947 }
948 948
949 void WebMediaPlayerAndroid::OnDidExitFullscreen() { 949 void WebMediaPlayerAndroid::OnDidExitFullscreen() {
950 // |needs_external_surface_| is always false on non-TV devices. 950 // |needs_external_surface_| is always false on non-TV devices.
951 if (!needs_external_surface_) 951 if (!needs_external_surface_)
952 SetNeedsEstablishPeer(true); 952 SetNeedsEstablishPeer(true);
953 // We had the fullscreen surface connected to Android MediaPlayer, 953 // We had the fullscreen surface connected to Android MediaPlayer,
954 // so reconnect our surface texture for embedded playback. 954 // so reconnect our surface texture for embedded playback.
955 if (!paused() && needs_establish_peer_) 955 if (!paused() && needs_establish_peer_) {
956 TryCreateStreamTextureProxyIfNeeded();
956 EstablishSurfaceTexturePeer(); 957 EstablishSurfaceTexturePeer();
958 }
957 959
958 #if defined(VIDEO_HOLE) 960 #if defined(VIDEO_HOLE)
959 if (!paused() && needs_external_surface_) 961 if (!paused() && needs_external_surface_)
960 player_manager_->RequestExternalSurface(player_id_, last_computed_rect_); 962 player_manager_->RequestExternalSurface(player_id_, last_computed_rect_);
961 #endif // defined(VIDEO_HOLE) 963 #endif // defined(VIDEO_HOLE)
962 is_fullscreen_ = false; 964 is_fullscreen_ = false;
963 client_->repaint(); 965 client_->repaint();
964 } 966 }
965 967
966 void WebMediaPlayerAndroid::OnMediaPlayerPlay() { 968 void WebMediaPlayerAndroid::OnMediaPlayerPlay() {
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after
1205 } 1207 }
1206 1208
1207 void WebMediaPlayerAndroid::ReallocateVideoFrame() { 1209 void WebMediaPlayerAndroid::ReallocateVideoFrame() {
1208 DCHECK(main_thread_checker_.CalledOnValidThread()); 1210 DCHECK(main_thread_checker_.CalledOnValidThread());
1209 if (needs_external_surface_) { 1211 if (needs_external_surface_) {
1210 // VideoFrame::CreateHoleFrame is only defined under VIDEO_HOLE. 1212 // VideoFrame::CreateHoleFrame is only defined under VIDEO_HOLE.
1211 #if defined(VIDEO_HOLE) 1213 #if defined(VIDEO_HOLE)
1212 if (!natural_size_.isEmpty()) { 1214 if (!natural_size_.isEmpty()) {
1213 // Now we finally know that "stream texture" and "video frame" won't 1215 // Now we finally know that "stream texture" and "video frame" won't
1214 // be needed. EME uses "external surface" and "video hole" instead. 1216 // be needed. EME uses "external surface" and "video hole" instead.
1215 ResetStreamTextureProxy(); 1217 RemoveSurfaceTextureAndProxy();
1216 scoped_refptr<VideoFrame> new_frame = 1218 scoped_refptr<VideoFrame> new_frame =
1217 VideoFrame::CreateHoleFrame(natural_size_); 1219 VideoFrame::CreateHoleFrame(natural_size_);
1218 SetCurrentFrameInternal(new_frame); 1220 SetCurrentFrameInternal(new_frame);
1219 // Force the client to grab the hole frame. 1221 // Force the client to grab the hole frame.
1220 client_->repaint(); 1222 client_->repaint();
1221 } 1223 }
1222 #else 1224 #else
1223 NOTIMPLEMENTED() << "Hole punching not supported without VIDEO_HOLE flag"; 1225 NOTIMPLEMENTED() << "Hole punching not supported without VIDEO_HOLE flag";
1224 #endif // defined(VIDEO_HOLE) 1226 #endif // defined(VIDEO_HOLE)
1225 } else if (!is_remote_ && texture_id_) { 1227 } else if (!is_remote_ && texture_id_) {
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
1284 1286
1285 return video_frame; 1287 return video_frame;
1286 } 1288 }
1287 1289
1288 void WebMediaPlayerAndroid::PutCurrentFrame() { 1290 void WebMediaPlayerAndroid::PutCurrentFrame() {
1289 } 1291 }
1290 1292
1291 void WebMediaPlayerAndroid::ResetStreamTextureProxy() { 1293 void WebMediaPlayerAndroid::ResetStreamTextureProxy() {
1292 DCHECK(main_thread_checker_.CalledOnValidThread()); 1294 DCHECK(main_thread_checker_.CalledOnValidThread());
1293 1295
1296 RemoveSurfaceTextureAndProxy();
1297
1298 TryCreateStreamTextureProxyIfNeeded();
1299 if (needs_establish_peer_ && is_playing_)
1300 EstablishSurfaceTexturePeer();
1301 }
1302
1303 void WebMediaPlayerAndroid::RemoveSurfaceTextureAndProxy() {
1304 DCHECK(main_thread_checker_.CalledOnValidThread());
1305
1294 if (stream_id_) { 1306 if (stream_id_) {
1295 GLES2Interface* gl = stream_texture_factory_->ContextGL(); 1307 GLES2Interface* gl = stream_texture_factory_->ContextGL();
1296 gl->DeleteTextures(1, &texture_id_); 1308 gl->DeleteTextures(1, &texture_id_);
1297 // Flush to ensure that the stream texture gets deleted in a timely fashion. 1309 // Flush to ensure that the stream texture gets deleted in a timely fashion.
1298 gl->ShallowFlushCHROMIUM(); 1310 gl->ShallowFlushCHROMIUM();
1299 texture_id_ = 0; 1311 texture_id_ = 0;
1300 texture_mailbox_ = gpu::Mailbox(); 1312 texture_mailbox_ = gpu::Mailbox();
1301 stream_id_ = 0; 1313 stream_id_ = 0;
1302 } 1314 }
1303 stream_texture_proxy_.reset(); 1315 stream_texture_proxy_.reset();
1304 needs_establish_peer_ = !needs_external_surface_ && !is_remote_ && 1316 needs_establish_peer_ = !needs_external_surface_ && !is_remote_ &&
1305 !is_fullscreen_ && 1317 !is_fullscreen_ &&
1306 (hasVideo() || IsHLSStream()); 1318 (hasVideo() || IsHLSStream());
1307
1308 TryCreateStreamTextureProxyIfNeeded();
1309 if (needs_establish_peer_ && is_playing_)
1310 EstablishSurfaceTexturePeer();
1311 } 1319 }
1312 1320
1313 void WebMediaPlayerAndroid::TryCreateStreamTextureProxyIfNeeded() { 1321 void WebMediaPlayerAndroid::TryCreateStreamTextureProxyIfNeeded() {
1314 DCHECK(main_thread_checker_.CalledOnValidThread()); 1322 DCHECK(main_thread_checker_.CalledOnValidThread());
1315 // Already created. 1323 // Already created.
1316 if (stream_texture_proxy_) 1324 if (stream_texture_proxy_)
1317 return; 1325 return;
1318 1326
1319 // No factory to create proxy. 1327 // No factory to create proxy.
1320 if (!stream_texture_factory_.get()) 1328 if (!stream_texture_factory_.get())
(...skipping 536 matching lines...) Expand 10 before | Expand all | Expand 10 after
1857 1865
1858 bool WebMediaPlayerAndroid::IsHLSStream() const { 1866 bool WebMediaPlayerAndroid::IsHLSStream() const {
1859 std::string mime; 1867 std::string mime;
1860 GURL url = redirected_url_.is_empty() ? url_ : redirected_url_; 1868 GURL url = redirected_url_.is_empty() ? url_ : redirected_url_;
1861 if (!net::GetMimeTypeFromFile(base::FilePath(url.path()), &mime)) 1869 if (!net::GetMimeTypeFromFile(base::FilePath(url.path()), &mime))
1862 return false; 1870 return false;
1863 return !mime.compare("application/x-mpegurl"); 1871 return !mime.compare("application/x-mpegurl");
1864 } 1872 }
1865 1873
1866 } // namespace content 1874 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/media/android/webmediaplayer_android.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698