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

Side by Side Diff: content/renderer/media/renderer_gpu_video_accelerator_factories.cc

Issue 23440015: Fix webrtc HW encode deadlock scenarios. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Created 7 years, 3 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/renderer_gpu_video_accelerator_factories.h" 5 #include "content/renderer/media/renderer_gpu_video_accelerator_factories.h"
6 6
7 #include <GLES2/gl2.h> 7 #include <GLES2/gl2.h>
8 #include <GLES2/gl2ext.h> 8 #include <GLES2/gl2ext.h>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
44 // Unretained to avoid ref/deref'ing |*this|, which is not yet 44 // Unretained to avoid ref/deref'ing |*this|, which is not yet
45 // stored in a scoped_refptr. Safe because the Wait() below 45 // stored in a scoped_refptr. Safe because the Wait() below
46 // keeps us alive until this task completes. 46 // keeps us alive until this task completes.
47 base::Unretained(this), 47 base::Unretained(this),
48 // OK to pass raw because the pointee is only deleted on the 48 // OK to pass raw because the pointee is only deleted on the
49 // compositor thread, and only as the result of a PostTask from 49 // compositor thread, and only as the result of a PostTask from
50 // the render thread which can only happen after this function 50 // the render thread which can only happen after this function
51 // returns, so our PostTask will run first. 51 // returns, so our PostTask will run first.
52 context)); 52 context));
53 message_loop_async_waiter_.Wait(); 53 message_loop_async_waiter_.Wait();
54
55 shm_alloc_thread_.reset(
56 new base::Thread("RendererGpuVideoAccelFactsSHMAllocThread"));
57 CHECK(shm_alloc_thread_->Start());
58
59 shm_alloc_message_loop_ = shm_alloc_thread_->message_loop_proxy();
54 } 60 }
55 61
56 RendererGpuVideoAcceleratorFactories::RendererGpuVideoAcceleratorFactories() 62 RendererGpuVideoAcceleratorFactories::RendererGpuVideoAcceleratorFactories()
57 : aborted_waiter_(true, false), 63 : aborted_waiter_(true, false),
58 message_loop_async_waiter_(false, false), 64 message_loop_async_waiter_(false, false),
59 render_thread_async_waiter_(false, false) {} 65 render_thread_async_waiter_(false, false) {}
60 66
61 void RendererGpuVideoAcceleratorFactories::AsyncGetContext( 67 void RendererGpuVideoAcceleratorFactories::AsyncGetContext(
62 WebGraphicsContext3DCommandBufferImpl* context) { 68 WebGraphicsContext3DCommandBufferImpl* context) {
63 context_ = context->AsWeakPtr(); 69 context_ = context->AsWeakPtr();
(...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after
356 GL_UNSIGNED_BYTE, 362 GL_UNSIGNED_BYTE,
357 read_pixels_bitmap_.pixelRef()->pixels()); 363 read_pixels_bitmap_.pixelRef()->pixels());
358 gles2->DeleteFramebuffers(1, &fb); 364 gles2->DeleteFramebuffers(1, &fb);
359 gles2->DeleteTextures(1, &tmp_texture); 365 gles2->DeleteTextures(1, &tmp_texture);
360 DCHECK_EQ(gles2->GetError(), static_cast<GLenum>(GL_NO_ERROR)); 366 DCHECK_EQ(gles2->GetError(), static_cast<GLenum>(GL_NO_ERROR));
361 message_loop_async_waiter_.Signal(); 367 message_loop_async_waiter_.Signal();
362 } 368 }
363 369
364 base::SharedMemory* RendererGpuVideoAcceleratorFactories::CreateSharedMemory( 370 base::SharedMemory* RendererGpuVideoAcceleratorFactories::CreateSharedMemory(
365 size_t size) { 371 size_t size) {
366 if (main_message_loop_->BelongsToCurrentThread()) { 372 if (shm_alloc_message_loop_->BelongsToCurrentThread()) {
367 return ChildThread::current()->AllocateSharedMemory(size); 373 return ChildThread::current()->AllocateSharedMemory(size);
368 } 374 }
369 main_message_loop_->PostTask( 375 shm_alloc_message_loop_->PostTask(
370 FROM_HERE, 376 FROM_HERE,
371 base::Bind(&RendererGpuVideoAcceleratorFactories::AsyncCreateSharedMemory, 377 base::Bind(&RendererGpuVideoAcceleratorFactories::AsyncCreateSharedMemory,
372 this, 378 this,
373 size)); 379 size));
374 380
375 base::WaitableEvent* objects[] = {&aborted_waiter_, 381 base::WaitableEvent* objects[] = {&aborted_waiter_,
376 &render_thread_async_waiter_}; 382 &render_thread_async_waiter_};
377 if (base::WaitableEvent::WaitMany(objects, arraysize(objects)) == 0) 383 if (base::WaitableEvent::WaitMany(objects, arraysize(objects)) == 0)
378 return NULL; 384 return NULL;
379 return shared_memory_segment_.release(); 385 return shared_memory_segment_.release();
380 } 386 }
381 387
382 void RendererGpuVideoAcceleratorFactories::AsyncCreateSharedMemory( 388 void RendererGpuVideoAcceleratorFactories::AsyncCreateSharedMemory(
383 size_t size) { 389 size_t size) {
384 DCHECK_EQ(base::MessageLoop::current(), 390 DCHECK(shm_alloc_message_loop_->BelongsToCurrentThread());
385 ChildThread::current()->message_loop());
386 391
387 shared_memory_segment_.reset( 392 shared_memory_segment_.reset(new base::SharedMemory());
388 ChildThread::current()->AllocateSharedMemory(size)); 393 CHECK(shared_memory_segment_->CreateAndMapAnonymous(size));
Ami GONE FROM CHROMIUM 2013/09/04 20:47:56 Do you even sandbox, bro? How is this working insi
Pawel Osciak 2013/09/05 05:46:33 Real men don't sandbox. Done for all the others.
389 render_thread_async_waiter_.Signal(); 394 render_thread_async_waiter_.Signal();
Ami GONE FROM CHROMIUM 2013/09/04 20:47:56 This is not legit considering it's no longer the r
Pawel Osciak 2013/09/05 05:46:33 Done.
390 } 395 }
391 396
392 scoped_refptr<base::MessageLoopProxy> 397 scoped_refptr<base::MessageLoopProxy>
393 RendererGpuVideoAcceleratorFactories::GetMessageLoop() { 398 RendererGpuVideoAcceleratorFactories::GetMessageLoop() {
394 return message_loop_; 399 return message_loop_;
395 } 400 }
396 401
397 void RendererGpuVideoAcceleratorFactories::Abort() { aborted_waiter_.Signal(); } 402 void RendererGpuVideoAcceleratorFactories::Abort() { aborted_waiter_.Signal(); }
398 403
399 bool RendererGpuVideoAcceleratorFactories::IsAborted() { 404 bool RendererGpuVideoAcceleratorFactories::IsAborted() {
400 return aborted_waiter_.IsSignaled(); 405 return aborted_waiter_.IsSignaled();
401 } 406 }
402 407
403 scoped_refptr<RendererGpuVideoAcceleratorFactories> 408 scoped_refptr<RendererGpuVideoAcceleratorFactories>
404 RendererGpuVideoAcceleratorFactories::Clone() { 409 RendererGpuVideoAcceleratorFactories::Clone() {
405 scoped_refptr<RendererGpuVideoAcceleratorFactories> factories = 410 scoped_refptr<RendererGpuVideoAcceleratorFactories> factories =
406 new RendererGpuVideoAcceleratorFactories(); 411 new RendererGpuVideoAcceleratorFactories();
407 factories->message_loop_ = message_loop_; 412 factories->message_loop_ = message_loop_;
408 factories->main_message_loop_ = main_message_loop_; 413 factories->main_message_loop_ = main_message_loop_;
409 factories->gpu_channel_host_ = gpu_channel_host_; 414 factories->gpu_channel_host_ = gpu_channel_host_;
410 factories->context_ = context_; 415 factories->context_ = context_;
416 factories->shm_alloc_message_loop_ = shm_alloc_message_loop_;
411 return factories; 417 return factories;
412 } 418 }
413 419
414 void 420 void
415 RendererGpuVideoAcceleratorFactories::AsyncDestroyVideoDecodeAccelerator() { 421 RendererGpuVideoAcceleratorFactories::AsyncDestroyVideoDecodeAccelerator() {
416 // OK to release because Destroy() will delete the VDA instance. 422 // OK to release because Destroy() will delete the VDA instance.
417 if (vda_) 423 if (vda_)
418 vda_.release()->Destroy(); 424 vda_.release()->Destroy();
419 } 425 }
420 426
421 void 427 void
422 RendererGpuVideoAcceleratorFactories::AsyncDestroyVideoEncodeAccelerator() { 428 RendererGpuVideoAcceleratorFactories::AsyncDestroyVideoEncodeAccelerator() {
423 // OK to release because Destroy() will delete the VDA instance. 429 // OK to release because Destroy() will delete the VDA instance.
424 if (vea_) 430 if (vea_)
425 vea_.release()->Destroy(); 431 vea_.release()->Destroy();
426 } 432 }
427 433
428 } // namespace content 434 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698