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

Side by Side Diff: content/common/gpu/media/vaapi_video_decode_accelerator.cc

Issue 185403020: Make VEA client of command buffer; move sync. IPC to VDA/VEA::Initialize() (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: 56683e7a Rebase. Created 6 years, 9 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "base/bind.h" 5 #include "base/bind.h"
6 #include "base/debug/trace_event.h" 6 #include "base/debug/trace_event.h"
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/metrics/histogram.h" 8 #include "base/metrics/histogram.h"
9 #include "base/stl_util.h" 9 #include "base/stl_util.h"
10 #include "base/strings/string_util.h" 10 #include "base/strings/string_util.h"
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after
237 237
238 VaapiVideoDecodeAccelerator::VaapiVideoDecodeAccelerator( 238 VaapiVideoDecodeAccelerator::VaapiVideoDecodeAccelerator(
239 Display* x_display, 239 Display* x_display,
240 const base::Callback<bool(void)>& make_context_current) 240 const base::Callback<bool(void)>& make_context_current)
241 : x_display_(x_display), 241 : x_display_(x_display),
242 make_context_current_(make_context_current), 242 make_context_current_(make_context_current),
243 state_(kUninitialized), 243 state_(kUninitialized),
244 input_ready_(&lock_), 244 input_ready_(&lock_),
245 surfaces_available_(&lock_), 245 surfaces_available_(&lock_),
246 message_loop_(base::MessageLoop::current()), 246 message_loop_(base::MessageLoop::current()),
247 weak_this_(base::AsWeakPtr(this)),
248 va_surface_release_cb_(media::BindToCurrentLoop(base::Bind(
249 &VaapiVideoDecodeAccelerator::RecycleVASurfaceID, weak_this_))),
250 decoder_thread_("VaapiDecoderThread"), 247 decoder_thread_("VaapiDecoderThread"),
251 num_frames_at_client_(0), 248 num_frames_at_client_(0),
252 num_stream_bufs_at_decoder_(0), 249 num_stream_bufs_at_decoder_(0),
253 finish_flush_pending_(false), 250 finish_flush_pending_(false),
254 awaiting_va_surfaces_recycle_(false), 251 awaiting_va_surfaces_recycle_(false),
255 requested_num_pics_(0) { 252 requested_num_pics_(0),
253 weak_this_factory_(this) {
254 weak_this_ = weak_this_factory_.GetWeakPtr();
255 va_surface_release_cb_ = media::BindToCurrentLoop(
256 base::Bind(&VaapiVideoDecodeAccelerator::RecycleVASurfaceID, weak_this_));
256 } 257 }
257 258
258 VaapiVideoDecodeAccelerator::~VaapiVideoDecodeAccelerator() { 259 VaapiVideoDecodeAccelerator::~VaapiVideoDecodeAccelerator() {
259 DCHECK_EQ(message_loop_, base::MessageLoop::current()); 260 DCHECK_EQ(message_loop_, base::MessageLoop::current());
260 } 261 }
261 262
262 class XFreeDeleter { 263 class XFreeDeleter {
263 public: 264 public:
264 void operator()(void* x) const { 265 void operator()(void* x) const {
265 ::XFree(x); 266 ::XFree(x);
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
320 new VaapiH264Decoder( 321 new VaapiH264Decoder(
321 vaapi_wrapper_.get(), 322 vaapi_wrapper_.get(),
322 media::BindToCurrentLoop(base::Bind( 323 media::BindToCurrentLoop(base::Bind(
323 &VaapiVideoDecodeAccelerator::SurfaceReady, weak_this_)), 324 &VaapiVideoDecodeAccelerator::SurfaceReady, weak_this_)),
324 base::Bind(&ReportToUMA))); 325 base::Bind(&ReportToUMA)));
325 326
326 CHECK(decoder_thread_.Start()); 327 CHECK(decoder_thread_.Start());
327 decoder_thread_proxy_ = decoder_thread_.message_loop_proxy(); 328 decoder_thread_proxy_ = decoder_thread_.message_loop_proxy();
328 329
329 state_ = kIdle; 330 state_ = kIdle;
330
331 message_loop_->PostTask(FROM_HERE, base::Bind(
332 &Client::NotifyInitializeDone, client_));
333 return true; 331 return true;
334 } 332 }
335 333
336 void VaapiVideoDecodeAccelerator::SurfaceReady( 334 void VaapiVideoDecodeAccelerator::SurfaceReady(
337 int32 input_id, 335 int32 input_id,
338 const scoped_refptr<VASurface>& va_surface) { 336 const scoped_refptr<VASurface>& va_surface) {
339 DCHECK_EQ(message_loop_, base::MessageLoop::current()); 337 DCHECK_EQ(message_loop_, base::MessageLoop::current());
340 DCHECK(!awaiting_va_surfaces_recycle_); 338 DCHECK(!awaiting_va_surfaces_recycle_);
341 339
342 // Drop any requests to output if we are resetting or being destroyed. 340 // Drop any requests to output if we are resetting or being destroyed.
(...skipping 554 matching lines...) Expand 10 before | Expand all | Expand 10 after
897 DCHECK_EQ(message_loop_, base::MessageLoop::current()); 895 DCHECK_EQ(message_loop_, base::MessageLoop::current());
898 896
899 if (state_ == kUninitialized || state_ == kDestroying) 897 if (state_ == kUninitialized || state_ == kDestroying)
900 return; 898 return;
901 899
902 DVLOG(1) << "Destroying VAVDA"; 900 DVLOG(1) << "Destroying VAVDA";
903 base::AutoLock auto_lock(lock_); 901 base::AutoLock auto_lock(lock_);
904 state_ = kDestroying; 902 state_ = kDestroying;
905 903
906 client_ptr_factory_.reset(); 904 client_ptr_factory_.reset();
905 weak_this_factory_.InvalidateWeakPtrs();
907 906
908 { 907 {
909 base::AutoUnlock auto_unlock(lock_); 908 base::AutoUnlock auto_unlock(lock_);
910 // Post a dummy task to the decoder_thread_ to ensure it is drained. 909 // Post a dummy task to the decoder_thread_ to ensure it is drained.
911 base::WaitableEvent waiter(false, false); 910 base::WaitableEvent waiter(false, false);
912 decoder_thread_proxy_->PostTask(FROM_HERE, base::Bind( 911 decoder_thread_proxy_->PostTask(FROM_HERE, base::Bind(
913 &base::WaitableEvent::Signal, base::Unretained(&waiter))); 912 &base::WaitableEvent::Signal, base::Unretained(&waiter)));
914 input_ready_.Signal(); 913 input_ready_.Signal();
915 surfaces_available_.Signal(); 914 surfaces_available_.Signal();
916 waiter.Wait(); 915 waiter.Wait();
917 decoder_thread_.Stop(); 916 decoder_thread_.Stop();
918 } 917 }
919 918
920 state_ = kUninitialized; 919 state_ = kUninitialized;
921 } 920 }
922 921
923 void VaapiVideoDecodeAccelerator::Destroy() { 922 void VaapiVideoDecodeAccelerator::Destroy() {
924 DCHECK_EQ(message_loop_, base::MessageLoop::current()); 923 DCHECK_EQ(message_loop_, base::MessageLoop::current());
925 Cleanup(); 924 Cleanup();
926 delete this; 925 delete this;
927 } 926 }
928 927
929 } // namespace content 928 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698