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

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

Issue 1293253003: Fix autoplay during prerendering for media elements on Android. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@defer_media
Patch Set: Created 5 years, 4 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
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 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
147 147
148 namespace content { 148 namespace content {
149 149
150 WebMediaPlayerAndroid::WebMediaPlayerAndroid( 150 WebMediaPlayerAndroid::WebMediaPlayerAndroid(
151 blink::WebFrame* frame, 151 blink::WebFrame* frame,
152 blink::WebMediaPlayerClient* client, 152 blink::WebMediaPlayerClient* client,
153 blink::WebMediaPlayerEncryptedMediaClient* encrypted_client, 153 blink::WebMediaPlayerEncryptedMediaClient* encrypted_client,
154 base::WeakPtr<media::WebMediaPlayerDelegate> delegate, 154 base::WeakPtr<media::WebMediaPlayerDelegate> delegate,
155 RendererMediaPlayerManager* player_manager, 155 RendererMediaPlayerManager* player_manager,
156 media::CdmFactory* cdm_factory, 156 media::CdmFactory* cdm_factory,
157 media::MediaPermission* media_permission,
158 blink::WebContentDecryptionModule* initial_cdm,
159 scoped_refptr<StreamTextureFactory> factory, 157 scoped_refptr<StreamTextureFactory> factory,
160 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, 158 const media::WebMediaPlayerParams& params)
161 media::MediaLog* media_log)
162 : RenderFrameObserver(RenderFrame::FromWebFrame(frame)), 159 : RenderFrameObserver(RenderFrame::FromWebFrame(frame)),
163 frame_(frame), 160 frame_(frame),
164 client_(client), 161 client_(client),
165 encrypted_client_(encrypted_client), 162 encrypted_client_(encrypted_client),
166 delegate_(delegate), 163 delegate_(delegate),
164 defer_load_cb_(params.defer_load_cb()),
167 buffered_(static_cast<size_t>(1)), 165 buffered_(static_cast<size_t>(1)),
168 media_task_runner_(task_runner), 166 media_task_runner_(params.media_task_runner()),
169 ignore_metadata_duration_change_(false), 167 ignore_metadata_duration_change_(false),
170 pending_seek_(false), 168 pending_seek_(false),
171 seeking_(false), 169 seeking_(false),
172 did_loading_progress_(false), 170 did_loading_progress_(false),
173 player_manager_(player_manager), 171 player_manager_(player_manager),
174 cdm_factory_(cdm_factory), 172 cdm_factory_(cdm_factory),
175 media_permission_(media_permission), 173 media_permission_(params.media_permission()),
176 network_state_(WebMediaPlayer::NetworkStateEmpty), 174 network_state_(WebMediaPlayer::NetworkStateEmpty),
177 ready_state_(WebMediaPlayer::ReadyStateHaveNothing), 175 ready_state_(WebMediaPlayer::ReadyStateHaveNothing),
178 texture_id_(0), 176 texture_id_(0),
179 stream_id_(0), 177 stream_id_(0),
180 is_player_initialized_(false), 178 is_player_initialized_(false),
181 is_playing_(false), 179 is_playing_(false),
182 needs_establish_peer_(true), 180 needs_establish_peer_(true),
183 has_size_info_(false), 181 has_size_info_(false),
184 // Compositor thread does not exist in layout tests. 182 // Threaded compositing isn't enabled universally yet.
185 compositor_loop_( 183 compositor_task_runner_(
186 RenderThreadImpl::current()->compositor_task_runner().get() 184 params.compositor_task_runner()
187 ? RenderThreadImpl::current()->compositor_task_runner() 185 ? params.compositor_task_runner()
188 : base::ThreadTaskRunnerHandle::Get()), 186 : base::ThreadTaskRunnerHandle::Get()),
189 stream_texture_factory_(factory), 187 stream_texture_factory_(factory),
190 needs_external_surface_(false), 188 needs_external_surface_(false),
191 is_fullscreen_(false), 189 is_fullscreen_(false),
192 video_frame_provider_client_(NULL), 190 video_frame_provider_client_(NULL),
193 player_type_(MEDIA_PLAYER_TYPE_URL), 191 player_type_(MEDIA_PLAYER_TYPE_URL),
194 is_remote_(false), 192 is_remote_(false),
195 media_log_(media_log), 193 media_log_(params.media_log()),
196 init_data_type_(media::EmeInitDataType::UNKNOWN), 194 init_data_type_(media::EmeInitDataType::UNKNOWN),
197 cdm_context_(NULL), 195 cdm_context_(NULL),
198 allow_stored_credentials_(false), 196 allow_stored_credentials_(false),
199 is_local_resource_(false), 197 is_local_resource_(false),
200 interpolator_(&default_tick_clock_), 198 interpolator_(&default_tick_clock_),
201 weak_factory_(this) { 199 weak_factory_(this) {
202 DCHECK(player_manager_); 200 DCHECK(player_manager_);
203 DCHECK(cdm_factory_); 201 DCHECK(cdm_factory_);
204 202
205 DCHECK(main_thread_checker_.CalledOnValidThread()); 203 DCHECK(main_thread_checker_.CalledOnValidThread());
(...skipping 10 matching lines...) Expand all
216 if (force_use_overlay_embedded_video_ || 214 if (force_use_overlay_embedded_video_ ||
217 player_manager_->ShouldUseVideoOverlayForEmbeddedEncryptedVideo()) { 215 player_manager_->ShouldUseVideoOverlayForEmbeddedEncryptedVideo()) {
218 // Defer stream texture creation until we are sure it's necessary. 216 // Defer stream texture creation until we are sure it's necessary.
219 needs_establish_peer_ = false; 217 needs_establish_peer_ = false;
220 current_frame_ = VideoFrame::CreateBlackFrame(gfx::Size(1, 1)); 218 current_frame_ = VideoFrame::CreateBlackFrame(gfx::Size(1, 1));
221 } 219 }
222 #endif // defined(VIDEO_HOLE) 220 #endif // defined(VIDEO_HOLE)
223 TryCreateStreamTextureProxyIfNeeded(); 221 TryCreateStreamTextureProxyIfNeeded();
224 interpolator_.SetUpperBound(base::TimeDelta()); 222 interpolator_.SetUpperBound(base::TimeDelta());
225 223
226 if (initial_cdm) { 224 if (params.initial_cdm()) {
227 cdm_context_ = 225 cdm_context_ = media::ToWebContentDecryptionModuleImpl(params.initial_cdm())
228 media::ToWebContentDecryptionModuleImpl(initial_cdm)->GetCdmContext(); 226 ->GetCdmContext();
229 } 227 }
230 } 228 }
231 229
232 WebMediaPlayerAndroid::~WebMediaPlayerAndroid() { 230 WebMediaPlayerAndroid::~WebMediaPlayerAndroid() {
233 DCHECK(main_thread_checker_.CalledOnValidThread()); 231 DCHECK(main_thread_checker_.CalledOnValidThread());
234 SetVideoFrameProviderClient(NULL); 232 SetVideoFrameProviderClient(NULL);
235 client_->setWebLayer(NULL); 233 client_->setWebLayer(NULL);
236 234
237 if (is_player_initialized_) 235 if (is_player_initialized_)
238 player_manager_->DestroyPlayer(player_id_); 236 player_manager_->DestroyPlayer(player_id_);
(...skipping 27 matching lines...) Expand all
266 base::WaitableEvent waiter(false, false); 264 base::WaitableEvent waiter(false, false);
267 media_source_delegate_->Stop( 265 media_source_delegate_->Stop(
268 base::Bind(&base::WaitableEvent::Signal, base::Unretained(&waiter))); 266 base::Bind(&base::WaitableEvent::Signal, base::Unretained(&waiter)));
269 waiter.Wait(); 267 waiter.Wait();
270 } 268 }
271 } 269 }
272 270
273 void WebMediaPlayerAndroid::load(LoadType load_type, 271 void WebMediaPlayerAndroid::load(LoadType load_type,
274 const blink::WebURL& url, 272 const blink::WebURL& url,
275 CORSMode cors_mode) { 273 CORSMode cors_mode) {
274 DVLOG(1) << __FUNCTION__ << "(" << load_type << ", " << url << ", "
Charlie Reis 2015/08/18 23:57:42 Is this log useful in a particular case?
DaleCurtis 2015/08/20 18:47:10 Done.
275 << cors_mode << ")";
276 if (!defer_load_cb_.is_null()) {
277 defer_load_cb_.Run(base::Bind(&WebMediaPlayerAndroid::DoLoad,
278 weak_factory_.GetWeakPtr(), load_type, url,
279 cors_mode));
280 return;
281 }
282 DoLoad(load_type, url, cors_mode);
283 }
284
285 void WebMediaPlayerAndroid::DoLoad(LoadType load_type,
286 const blink::WebURL& url,
287 CORSMode cors_mode) {
276 DCHECK(main_thread_checker_.CalledOnValidThread()); 288 DCHECK(main_thread_checker_.CalledOnValidThread());
277 289
278 media::ReportMetrics(load_type, GURL(url), 290 media::ReportMetrics(load_type, GURL(url),
279 GURL(frame_->document().securityOrigin().toString())); 291 GURL(frame_->document().securityOrigin().toString()));
280 292
281 switch (load_type) { 293 switch (load_type) {
282 case LoadTypeURL: 294 case LoadTypeURL:
283 player_type_ = MEDIA_PLAYER_TYPE_URL; 295 player_type_ = MEDIA_PLAYER_TYPE_URL;
284 break; 296 break;
285 297
(...skipping 965 matching lines...) Expand 10 before | Expand all | Expand 10 after
1251 } 1263 }
1252 } 1264 }
1253 1265
1254 void WebMediaPlayerAndroid::SetVideoFrameProviderClient( 1266 void WebMediaPlayerAndroid::SetVideoFrameProviderClient(
1255 cc::VideoFrameProvider::Client* client) { 1267 cc::VideoFrameProvider::Client* client) {
1256 // This is called from both the main renderer thread and the compositor 1268 // This is called from both the main renderer thread and the compositor
1257 // thread (when the main thread is blocked). 1269 // thread (when the main thread is blocked).
1258 1270
1259 // Set the callback target when a frame is produced. Need to do this before 1271 // Set the callback target when a frame is produced. Need to do this before
1260 // StopUsingProvider to ensure we really stop using the client. 1272 // StopUsingProvider to ensure we really stop using the client.
1261 if (stream_texture_proxy_) 1273 if (stream_texture_proxy_) {
1262 stream_texture_proxy_->BindToLoop(stream_id_, client, compositor_loop_); 1274 stream_texture_proxy_->BindToLoop(stream_id_, client,
1275 compositor_task_runner_);
1276 }
1263 1277
1264 if (video_frame_provider_client_ && video_frame_provider_client_ != client) 1278 if (video_frame_provider_client_ && video_frame_provider_client_ != client)
1265 video_frame_provider_client_->StopUsingProvider(); 1279 video_frame_provider_client_->StopUsingProvider();
1266 video_frame_provider_client_ = client; 1280 video_frame_provider_client_ = client;
1267 } 1281 }
1268 1282
1269 void WebMediaPlayerAndroid::SetCurrentFrameInternal( 1283 void WebMediaPlayerAndroid::SetCurrentFrameInternal(
1270 scoped_refptr<media::VideoFrame>& video_frame) { 1284 scoped_refptr<media::VideoFrame>& video_frame) {
1271 DCHECK(main_thread_checker_.CalledOnValidThread()); 1285 DCHECK(main_thread_checker_.CalledOnValidThread());
1272 base::AutoLock auto_lock(current_frame_lock_); 1286 base::AutoLock auto_lock(current_frame_lock_);
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
1338 // Not needed for hole punching. 1352 // Not needed for hole punching.
1339 if (!needs_establish_peer_) 1353 if (!needs_establish_peer_)
1340 return; 1354 return;
1341 1355
1342 stream_texture_proxy_.reset(stream_texture_factory_->CreateProxy()); 1356 stream_texture_proxy_.reset(stream_texture_factory_->CreateProxy());
1343 if (stream_texture_proxy_) { 1357 if (stream_texture_proxy_) {
1344 DoCreateStreamTexture(); 1358 DoCreateStreamTexture();
1345 ReallocateVideoFrame(); 1359 ReallocateVideoFrame();
1346 if (video_frame_provider_client_) { 1360 if (video_frame_provider_client_) {
1347 stream_texture_proxy_->BindToLoop( 1361 stream_texture_proxy_->BindToLoop(
1348 stream_id_, video_frame_provider_client_, compositor_loop_); 1362 stream_id_, video_frame_provider_client_, compositor_task_runner_);
1349 } 1363 }
1350 } 1364 }
1351 } 1365 }
1352 1366
1353 void WebMediaPlayerAndroid::EstablishSurfaceTexturePeer() { 1367 void WebMediaPlayerAndroid::EstablishSurfaceTexturePeer() {
1354 DCHECK(main_thread_checker_.CalledOnValidThread()); 1368 DCHECK(main_thread_checker_.CalledOnValidThread());
1355 if (!stream_texture_proxy_) 1369 if (!stream_texture_proxy_)
1356 return; 1370 return;
1357 1371
1358 if (stream_texture_factory_.get() && stream_id_) 1372 if (stream_texture_factory_.get() && stream_id_)
(...skipping 529 matching lines...) Expand 10 before | Expand all | Expand 10 after
1888 1902
1889 bool is_hls = IsHLSStream(); 1903 bool is_hls = IsHLSStream();
1890 UMA_HISTOGRAM_BOOLEAN("Media.Android.IsHttpLiveStreamingMedia", is_hls); 1904 UMA_HISTOGRAM_BOOLEAN("Media.Android.IsHttpLiveStreamingMedia", is_hls);
1891 if (is_hls) { 1905 if (is_hls) {
1892 media::RecordOriginOfHLSPlayback( 1906 media::RecordOriginOfHLSPlayback(
1893 GURL(frame_->document().securityOrigin().toString())); 1907 GURL(frame_->document().securityOrigin().toString()));
1894 } 1908 }
1895 } 1909 }
1896 1910
1897 } // namespace content 1911 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698