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

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: Rename test class. 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 if (!defer_load_cb_.is_null()) {
275 defer_load_cb_.Run(base::Bind(&WebMediaPlayerAndroid::DoLoad,
276 weak_factory_.GetWeakPtr(), load_type, url,
277 cors_mode));
278 return;
279 }
280 DoLoad(load_type, url, cors_mode);
281 }
282
283 void WebMediaPlayerAndroid::DoLoad(LoadType load_type,
284 const blink::WebURL& url,
285 CORSMode cors_mode) {
276 DCHECK(main_thread_checker_.CalledOnValidThread()); 286 DCHECK(main_thread_checker_.CalledOnValidThread());
277 287
278 media::ReportMetrics(load_type, GURL(url), 288 media::ReportMetrics(load_type, GURL(url),
279 GURL(frame_->document().securityOrigin().toString())); 289 GURL(frame_->document().securityOrigin().toString()));
280 290
281 switch (load_type) { 291 switch (load_type) {
282 case LoadTypeURL: 292 case LoadTypeURL:
283 player_type_ = MEDIA_PLAYER_TYPE_URL; 293 player_type_ = MEDIA_PLAYER_TYPE_URL;
284 break; 294 break;
285 295
(...skipping 965 matching lines...) Expand 10 before | Expand all | Expand 10 after
1251 } 1261 }
1252 } 1262 }
1253 1263
1254 void WebMediaPlayerAndroid::SetVideoFrameProviderClient( 1264 void WebMediaPlayerAndroid::SetVideoFrameProviderClient(
1255 cc::VideoFrameProvider::Client* client) { 1265 cc::VideoFrameProvider::Client* client) {
1256 // This is called from both the main renderer thread and the compositor 1266 // This is called from both the main renderer thread and the compositor
1257 // thread (when the main thread is blocked). 1267 // thread (when the main thread is blocked).
1258 1268
1259 // Set the callback target when a frame is produced. Need to do this before 1269 // Set the callback target when a frame is produced. Need to do this before
1260 // StopUsingProvider to ensure we really stop using the client. 1270 // StopUsingProvider to ensure we really stop using the client.
1261 if (stream_texture_proxy_) 1271 if (stream_texture_proxy_) {
1262 stream_texture_proxy_->BindToLoop(stream_id_, client, compositor_loop_); 1272 stream_texture_proxy_->BindToLoop(stream_id_, client,
1273 compositor_task_runner_);
1274 }
1263 1275
1264 if (video_frame_provider_client_ && video_frame_provider_client_ != client) 1276 if (video_frame_provider_client_ && video_frame_provider_client_ != client)
1265 video_frame_provider_client_->StopUsingProvider(); 1277 video_frame_provider_client_->StopUsingProvider();
1266 video_frame_provider_client_ = client; 1278 video_frame_provider_client_ = client;
1267 } 1279 }
1268 1280
1269 void WebMediaPlayerAndroid::SetCurrentFrameInternal( 1281 void WebMediaPlayerAndroid::SetCurrentFrameInternal(
1270 scoped_refptr<media::VideoFrame>& video_frame) { 1282 scoped_refptr<media::VideoFrame>& video_frame) {
1271 DCHECK(main_thread_checker_.CalledOnValidThread()); 1283 DCHECK(main_thread_checker_.CalledOnValidThread());
1272 base::AutoLock auto_lock(current_frame_lock_); 1284 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. 1350 // Not needed for hole punching.
1339 if (!needs_establish_peer_) 1351 if (!needs_establish_peer_)
1340 return; 1352 return;
1341 1353
1342 stream_texture_proxy_.reset(stream_texture_factory_->CreateProxy()); 1354 stream_texture_proxy_.reset(stream_texture_factory_->CreateProxy());
1343 if (stream_texture_proxy_) { 1355 if (stream_texture_proxy_) {
1344 DoCreateStreamTexture(); 1356 DoCreateStreamTexture();
1345 ReallocateVideoFrame(); 1357 ReallocateVideoFrame();
1346 if (video_frame_provider_client_) { 1358 if (video_frame_provider_client_) {
1347 stream_texture_proxy_->BindToLoop( 1359 stream_texture_proxy_->BindToLoop(
1348 stream_id_, video_frame_provider_client_, compositor_loop_); 1360 stream_id_, video_frame_provider_client_, compositor_task_runner_);
1349 } 1361 }
1350 } 1362 }
1351 } 1363 }
1352 1364
1353 void WebMediaPlayerAndroid::EstablishSurfaceTexturePeer() { 1365 void WebMediaPlayerAndroid::EstablishSurfaceTexturePeer() {
1354 DCHECK(main_thread_checker_.CalledOnValidThread()); 1366 DCHECK(main_thread_checker_.CalledOnValidThread());
1355 if (!stream_texture_proxy_) 1367 if (!stream_texture_proxy_)
1356 return; 1368 return;
1357 1369
1358 if (stream_texture_factory_.get() && stream_id_) 1370 if (stream_texture_factory_.get() && stream_id_)
(...skipping 529 matching lines...) Expand 10 before | Expand all | Expand 10 after
1888 1900
1889 bool is_hls = IsHLSStream(); 1901 bool is_hls = IsHLSStream();
1890 UMA_HISTOGRAM_BOOLEAN("Media.Android.IsHttpLiveStreamingMedia", is_hls); 1902 UMA_HISTOGRAM_BOOLEAN("Media.Android.IsHttpLiveStreamingMedia", is_hls);
1891 if (is_hls) { 1903 if (is_hls) {
1892 media::RecordOriginOfHLSPlayback( 1904 media::RecordOriginOfHLSPlayback(
1893 GURL(frame_->document().securityOrigin().toString())); 1905 GURL(frame_->document().securityOrigin().toString()));
1894 } 1906 }
1895 } 1907 }
1896 1908
1897 } // namespace content 1909 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/media/android/webmediaplayer_android.h ('k') | content/renderer/render_frame_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698