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

Side by Side Diff: content/renderer/render_frame_impl.cc

Issue 445013002: media: Optimize HW Video to 2D Canvas copy. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase to ToT. Address nits Created 6 years, 2 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/render_frame_impl.h" 5 #include "content/renderer/render_frame_impl.h"
6 6
7 #include <map> 7 #include <map>
8 #include <string> 8 #include <string>
9 9
10 #include "base/auto_reset.h" 10 #include "base/auto_reset.h"
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
140 140
141 #if defined(OS_ANDROID) 141 #if defined(OS_ANDROID)
142 #include <cpu-features.h> 142 #include <cpu-features.h>
143 143
144 #include "content/common/gpu/client/context_provider_command_buffer.h" 144 #include "content/common/gpu/client/context_provider_command_buffer.h"
145 #include "content/renderer/android/synchronous_compositor_factory.h" 145 #include "content/renderer/android/synchronous_compositor_factory.h"
146 #include "content/renderer/java/gin_java_bridge_dispatcher.h" 146 #include "content/renderer/java/gin_java_bridge_dispatcher.h"
147 #include "content/renderer/media/android/renderer_media_player_manager.h" 147 #include "content/renderer/media/android/renderer_media_player_manager.h"
148 #include "content/renderer/media/android/stream_texture_factory_impl.h" 148 #include "content/renderer/media/android/stream_texture_factory_impl.h"
149 #include "content/renderer/media/android/webmediaplayer_android.h" 149 #include "content/renderer/media/android/webmediaplayer_android.h"
150 #else
151 #include "webkit/common/gpu/context_provider_web_context.h"
150 #endif 152 #endif
151 153
152 #if defined(ENABLE_BROWSER_CDMS) 154 #if defined(ENABLE_BROWSER_CDMS)
153 #include "content/renderer/media/crypto/renderer_cdm_manager.h" 155 #include "content/renderer/media/crypto/renderer_cdm_manager.h"
154 #endif 156 #endif
155 157
156 using blink::WebContextMenuData; 158 using blink::WebContextMenuData;
157 using blink::WebData; 159 using blink::WebData;
158 using blink::WebDataSource; 160 using blink::WebDataSource;
159 using blink::WebDocument; 161 using blink::WebDocument;
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
233 if (urls[i] != GURL(kSwappedOutURL)) 235 if (urls[i] != GURL(kSwappedOutURL))
234 result->push_back(urls[i]); 236 result->push_back(urls[i]);
235 else 237 else
236 result->push_back(blank_url); 238 result->push_back(blank_url);
237 } 239 }
238 } 240 }
239 241
240 // Returns the original request url. If there is no redirect, the original 242 // Returns the original request url. If there is no redirect, the original
241 // url is the same as ds->request()->url(). If the WebDataSource belongs to a 243 // url is the same as ds->request()->url(). If the WebDataSource belongs to a
242 // frame was loaded by loadData, the original url will be ds->unreachableURL() 244 // frame was loaded by loadData, the original url will be ds->unreachableURL()
243 static GURL GetOriginalRequestURL(WebDataSource* ds) { 245 GURL GetOriginalRequestURL(WebDataSource* ds) {
244 // WebDataSource has unreachable URL means that the frame is loaded through 246 // WebDataSource has unreachable URL means that the frame is loaded through
245 // blink::WebFrame::loadData(), and the base URL will be in the redirect 247 // blink::WebFrame::loadData(), and the base URL will be in the redirect
246 // chain. However, we never visited the baseURL. So in this case, we should 248 // chain. However, we never visited the baseURL. So in this case, we should
247 // use the unreachable URL as the original URL. 249 // use the unreachable URL as the original URL.
248 if (ds->hasUnreachableURL()) 250 if (ds->hasUnreachableURL())
249 return ds->unreachableURL(); 251 return ds->unreachableURL();
250 252
251 std::vector<GURL> redirects; 253 std::vector<GURL> redirects;
252 GetRedirectChain(ds, &redirects); 254 GetRedirectChain(ds, &redirects);
253 if (!redirects.empty()) 255 if (!redirects.empty())
254 return redirects.at(0); 256 return redirects.at(0);
255 257
256 return ds->originalRequest().url(); 258 return ds->originalRequest().url();
257 } 259 }
258 260
259 NOINLINE static void CrashIntentionally() { 261 NOINLINE void CrashIntentionally() {
260 // NOTE(shess): Crash directly rather than using NOTREACHED() so 262 // NOTE(shess): Crash directly rather than using NOTREACHED() so
261 // that the signature is easier to triage in crash reports. 263 // that the signature is easier to triage in crash reports.
262 volatile int* zero = NULL; 264 volatile int* zero = NULL;
263 *zero = 0; 265 *zero = 0;
264 } 266 }
265 267
266 #if defined(ADDRESS_SANITIZER) || defined(SYZYASAN) 268 #if defined(ADDRESS_SANITIZER) || defined(SYZYASAN)
267 NOINLINE static void MaybeTriggerAsanError(const GURL& url) { 269 NOINLINE void MaybeTriggerAsanError(const GURL& url) {
268 // NOTE(rogerm): We intentionally perform an invalid heap access here in 270 // NOTE(rogerm): We intentionally perform an invalid heap access here in
269 // order to trigger an Address Sanitizer (ASAN) error report. 271 // order to trigger an Address Sanitizer (ASAN) error report.
270 const char kCrashDomain[] = "crash"; 272 const char kCrashDomain[] = "crash";
271 const char kHeapOverflow[] = "/heap-overflow"; 273 const char kHeapOverflow[] = "/heap-overflow";
272 const char kHeapUnderflow[] = "/heap-underflow"; 274 const char kHeapUnderflow[] = "/heap-underflow";
273 const char kUseAfterFree[] = "/use-after-free"; 275 const char kUseAfterFree[] = "/use-after-free";
274 #if defined(SYZYASAN) 276 #if defined(SYZYASAN)
275 const char kCorruptHeapBlock[] = "/corrupt-heap-block"; 277 const char kCorruptHeapBlock[] = "/corrupt-heap-block";
276 const char kCorruptHeap[] = "/corrupt-heap"; 278 const char kCorruptHeap[] = "/corrupt-heap";
277 #endif 279 #endif
(...skipping 14 matching lines...) Expand all
292 #if defined(SYZYASAN) 294 #if defined(SYZYASAN)
293 } else if (crash_type == kCorruptHeapBlock) { 295 } else if (crash_type == kCorruptHeapBlock) {
294 base::debug::AsanCorruptHeapBlock(); 296 base::debug::AsanCorruptHeapBlock();
295 } else if (crash_type == kCorruptHeap) { 297 } else if (crash_type == kCorruptHeap) {
296 base::debug::AsanCorruptHeap(); 298 base::debug::AsanCorruptHeap();
297 #endif 299 #endif
298 } 300 }
299 } 301 }
300 #endif // ADDRESS_SANITIZER || SYZYASAN 302 #endif // ADDRESS_SANITIZER || SYZYASAN
301 303
302 static void MaybeHandleDebugURL(const GURL& url) { 304 void MaybeHandleDebugURL(const GURL& url) {
303 if (!url.SchemeIs(kChromeUIScheme)) 305 if (!url.SchemeIs(kChromeUIScheme))
304 return; 306 return;
305 if (url == GURL(kChromeUICrashURL)) { 307 if (url == GURL(kChromeUICrashURL)) {
306 CrashIntentionally(); 308 CrashIntentionally();
307 } else if (url == GURL(kChromeUIDumpURL)) { 309 } else if (url == GURL(kChromeUIDumpURL)) {
308 // This URL will only correctly create a crash dump file if content is 310 // This URL will only correctly create a crash dump file if content is
309 // hosted in a process that has correctly called 311 // hosted in a process that has correctly called
310 // base::debug::SetDumpWithoutCrashingFunction. Refer to the documentation 312 // base::debug::SetDumpWithoutCrashingFunction. Refer to the documentation
311 // of base::debug::DumpWithoutCrashing for more details. 313 // of base::debug::DumpWithoutCrashing for more details.
312 base::debug::DumpWithoutCrashing(); 314 base::debug::DumpWithoutCrashing();
313 } else if (url == GURL(kChromeUIKillURL)) { 315 } else if (url == GURL(kChromeUIKillURL)) {
314 base::KillProcess(base::GetCurrentProcessHandle(), 1, false); 316 base::KillProcess(base::GetCurrentProcessHandle(), 1, false);
315 } else if (url == GURL(kChromeUIHangURL)) { 317 } else if (url == GURL(kChromeUIHangURL)) {
316 for (;;) { 318 for (;;) {
317 base::PlatformThread::Sleep(base::TimeDelta::FromSeconds(1)); 319 base::PlatformThread::Sleep(base::TimeDelta::FromSeconds(1));
318 } 320 }
319 } else if (url == GURL(kChromeUIShorthangURL)) { 321 } else if (url == GURL(kChromeUIShorthangURL)) {
320 base::PlatformThread::Sleep(base::TimeDelta::FromSeconds(20)); 322 base::PlatformThread::Sleep(base::TimeDelta::FromSeconds(20));
321 } 323 }
322 324
323 #if defined(ADDRESS_SANITIZER) || defined(SYZYASAN) 325 #if defined(ADDRESS_SANITIZER) || defined(SYZYASAN)
324 MaybeTriggerAsanError(url); 326 MaybeTriggerAsanError(url);
325 #endif // ADDRESS_SANITIZER || SYZYASAN 327 #endif // ADDRESS_SANITIZER || SYZYASAN
326 } 328 }
327 329
328 // Returns false unless this is a top-level navigation. 330 // Returns false unless this is a top-level navigation.
329 static bool IsTopLevelNavigation(WebFrame* frame) { 331 bool IsTopLevelNavigation(WebFrame* frame) {
330 return frame->parent() == NULL; 332 return frame->parent() == NULL;
331 } 333 }
332 334
333 // Returns false unless this is a top-level navigation that crosses origins. 335 // Returns false unless this is a top-level navigation that crosses origins.
334 static bool IsNonLocalTopLevelNavigation(const GURL& url, 336 bool IsNonLocalTopLevelNavigation(const GURL& url,
335 WebFrame* frame, 337 WebFrame* frame,
336 WebNavigationType type, 338 WebNavigationType type,
337 bool is_form_post) { 339 bool is_form_post) {
338 if (!IsTopLevelNavigation(frame)) 340 if (!IsTopLevelNavigation(frame))
339 return false; 341 return false;
340 342
341 // Navigations initiated within Webkit are not sent out to the external host 343 // Navigations initiated within Webkit are not sent out to the external host
342 // in the following cases. 344 // in the following cases.
343 // 1. The url scheme is not http/https 345 // 1. The url scheme is not http/https
344 // 2. The origin of the url and the opener is the same in which case the 346 // 2. The origin of the url and the opener is the same in which case the
345 // opener relationship is maintained. 347 // opener relationship is maintained.
346 // 3. Reloads/form submits/back forward navigations 348 // 3. Reloads/form submits/back forward navigations
347 if (!url.SchemeIs(url::kHttpScheme) && !url.SchemeIs(url::kHttpsScheme)) 349 if (!url.SchemeIs(url::kHttpScheme) && !url.SchemeIs(url::kHttpsScheme))
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
403 browser_navigation_start, renderer_navigation_start); 405 browser_navigation_start, renderer_navigation_start);
404 double navigation_start_seconds = 406 double navigation_start_seconds =
405 (navigation_start - base::TimeTicks()).InSecondsF(); 407 (navigation_start - base::TimeTicks()).InSecondsF();
406 frame->provisionalDataSource()->setNavigationStartTime( 408 frame->provisionalDataSource()->setNavigationStartTime(
407 navigation_start_seconds); 409 navigation_start_seconds);
408 // TODO(clamy): We need to provide additional timing values for the 410 // TODO(clamy): We need to provide additional timing values for the
409 // Navigation Timing API to work with browser-side navigations. 411 // Navigation Timing API to work with browser-side navigations.
410 } 412 }
411 } 413 }
412 414
415 #if !defined(OS_ANDROID)
416 cc::ContextProvider* GetSharedMainThreadContextProvider() {
417 RenderThreadImpl* render_thread = RenderThreadImpl::current();
418 DCHECK(render_thread);
419 DCHECK(render_thread->message_loop() == base::MessageLoop::current());
420 return render_thread->SharedMainThreadContextProvider().get();
421 }
422 #endif
423
424 RenderFrameImpl* (*g_create_render_frame_impl)(RenderViewImpl*, int32) = NULL;
425
413 } // namespace 426 } // namespace
414 427
415 static RenderFrameImpl* (*g_create_render_frame_impl)(RenderViewImpl*, int32) =
416 NULL;
417 428
418 // static 429 // static
419 RenderFrameImpl* RenderFrameImpl::Create(RenderViewImpl* render_view, 430 RenderFrameImpl* RenderFrameImpl::Create(RenderViewImpl* render_view,
420 int32 routing_id) { 431 int32 routing_id) {
421 DCHECK(routing_id != MSG_ROUTING_NONE); 432 DCHECK(routing_id != MSG_ROUTING_NONE);
422 433
423 if (g_create_render_frame_impl) 434 if (g_create_render_frame_impl)
424 return g_create_render_frame_impl(render_view, routing_id); 435 return g_create_render_frame_impl(render_view, routing_id);
425 else 436 else
426 return new RenderFrameImpl(render_view, routing_id); 437 return new RenderFrameImpl(render_view, routing_id);
(...skipping 1198 matching lines...) Expand 10 before | Expand all | Expand 10 after
1625 base::Unretained(GetContentClient()->renderer()), 1636 base::Unretained(GetContentClient()->renderer()),
1626 static_cast<RenderFrame*>(this)), 1637 static_cast<RenderFrame*>(this)),
1627 render_thread->GetAudioRendererMixerManager()->CreateInput( 1638 render_thread->GetAudioRendererMixerManager()->CreateInput(
1628 render_view_->routing_id_, routing_id_), 1639 render_view_->routing_id_, routing_id_),
1629 *render_thread->GetAudioHardwareConfig(), 1640 *render_thread->GetAudioHardwareConfig(),
1630 new RenderMediaLog(), 1641 new RenderMediaLog(),
1631 render_thread->GetGpuFactories(), 1642 render_thread->GetGpuFactories(),
1632 render_thread->GetMediaThreadTaskRunner(), 1643 render_thread->GetMediaThreadTaskRunner(),
1633 render_thread->compositor_message_loop_proxy(), 1644 render_thread->compositor_message_loop_proxy(),
1634 base::Bind(&EncryptedMediaPlayerSupportImpl::Create), 1645 base::Bind(&EncryptedMediaPlayerSupportImpl::Create),
1646 base::Bind(&GetSharedMainThreadContextProvider),
1635 initial_cdm); 1647 initial_cdm);
1636 return new media::WebMediaPlayerImpl(frame, 1648 return new media::WebMediaPlayerImpl(frame,
1637 client, 1649 client,
1638 weak_factory_.GetWeakPtr(), 1650 weak_factory_.GetWeakPtr(),
1639 params); 1651 params);
1640 #endif // defined(OS_ANDROID) 1652 #endif // defined(OS_ANDROID)
1641 } 1653 }
1642 1654
1643 blink::WebContentDecryptionModule* 1655 blink::WebContentDecryptionModule*
1644 RenderFrameImpl::createContentDecryptionModule( 1656 RenderFrameImpl::createContentDecryptionModule(
(...skipping 2329 matching lines...) Expand 10 before | Expand all | Expand 10 after
3974 3986
3975 #if defined(ENABLE_BROWSER_CDMS) 3987 #if defined(ENABLE_BROWSER_CDMS)
3976 RendererCdmManager* RenderFrameImpl::GetCdmManager() { 3988 RendererCdmManager* RenderFrameImpl::GetCdmManager() {
3977 if (!cdm_manager_) 3989 if (!cdm_manager_)
3978 cdm_manager_ = new RendererCdmManager(this); 3990 cdm_manager_ = new RendererCdmManager(this);
3979 return cdm_manager_; 3991 return cdm_manager_;
3980 } 3992 }
3981 #endif // defined(ENABLE_BROWSER_CDMS) 3993 #endif // defined(ENABLE_BROWSER_CDMS)
3982 3994
3983 } // namespace content 3995 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698