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

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

Issue 1207043002: Introduce a client minimum picture pool size (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 5 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 (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 "content/common/gpu/media/vaapi_video_decode_accelerator.h" 5 #include "content/common/gpu/media/vaapi_video_decode_accelerator.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "base/metrics/histogram.h" 9 #include "base/metrics/histogram.h"
10 #include "base/stl_util.h" 10 #include "base/stl_util.h"
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after
242 state_(kUninitialized), 242 state_(kUninitialized),
243 input_ready_(&lock_), 243 input_ready_(&lock_),
244 surfaces_available_(&lock_), 244 surfaces_available_(&lock_),
245 message_loop_(base::MessageLoop::current()), 245 message_loop_(base::MessageLoop::current()),
246 decoder_thread_("VaapiDecoderThread"), 246 decoder_thread_("VaapiDecoderThread"),
247 num_frames_at_client_(0), 247 num_frames_at_client_(0),
248 num_stream_bufs_at_decoder_(0), 248 num_stream_bufs_at_decoder_(0),
249 finish_flush_pending_(false), 249 finish_flush_pending_(false),
250 awaiting_va_surfaces_recycle_(false), 250 awaiting_va_surfaces_recycle_(false),
251 requested_num_pics_(0), 251 requested_num_pics_(0),
252 min_picture_count_(0),
252 bind_image_(bind_image), 253 bind_image_(bind_image),
253 weak_this_factory_(this) { 254 weak_this_factory_(this) {
254 weak_this_ = weak_this_factory_.GetWeakPtr(); 255 weak_this_ = weak_this_factory_.GetWeakPtr();
255 va_surface_release_cb_ = media::BindToCurrentLoop( 256 va_surface_release_cb_ = media::BindToCurrentLoop(
256 base::Bind(&VaapiVideoDecodeAccelerator::RecycleVASurfaceID, weak_this_)); 257 base::Bind(&VaapiVideoDecodeAccelerator::RecycleVASurfaceID, weak_this_));
257 } 258 }
258 259
259 VaapiVideoDecodeAccelerator::~VaapiVideoDecodeAccelerator() { 260 VaapiVideoDecodeAccelerator::~VaapiVideoDecodeAccelerator() {
260 DCHECK_EQ(message_loop_, base::MessageLoop::current()); 261 DCHECK_EQ(message_loop_, base::MessageLoop::current());
261 } 262 }
262 263
263 bool VaapiVideoDecodeAccelerator::Initialize(media::VideoCodecProfile profile, 264 bool VaapiVideoDecodeAccelerator::Initialize(media::VideoCodecProfile profile,
265 uint32 min_picture_count,
264 Client* client) { 266 Client* client) {
265 DCHECK_EQ(message_loop_, base::MessageLoop::current()); 267 DCHECK_EQ(message_loop_, base::MessageLoop::current());
266 268
267 client_ptr_factory_.reset(new base::WeakPtrFactory<Client>(client)); 269 client_ptr_factory_.reset(new base::WeakPtrFactory<Client>(client));
268 client_ = client_ptr_factory_->GetWeakPtr(); 270 client_ = client_ptr_factory_->GetWeakPtr();
269 271
270 base::AutoLock auto_lock(lock_); 272 base::AutoLock auto_lock(lock_);
271 DCHECK_EQ(state_, kUninitialized); 273 DCHECK_EQ(state_, kUninitialized);
272 DVLOG(2) << "Initializing VAVDA, profile: " << profile; 274 DVLOG(2) << "Initializing VAVDA, profile: " << profile;
273 275
(...skipping 27 matching lines...) Expand all
301 profile <= media::VP8PROFILE_MAX) { 303 profile <= media::VP8PROFILE_MAX) {
302 vp8_accelerator_.reset(new VaapiVP8Accelerator(this, vaapi_wrapper_.get())); 304 vp8_accelerator_.reset(new VaapiVP8Accelerator(this, vaapi_wrapper_.get()));
303 decoder_.reset(new VP8Decoder(vp8_accelerator_.get())); 305 decoder_.reset(new VP8Decoder(vp8_accelerator_.get()));
304 } else { 306 } else {
305 DLOG(ERROR) << "Unsupported profile " << profile; 307 DLOG(ERROR) << "Unsupported profile " << profile;
306 return false; 308 return false;
307 } 309 }
308 310
309 CHECK(decoder_thread_.Start()); 311 CHECK(decoder_thread_.Start());
310 decoder_thread_task_runner_ = decoder_thread_.task_runner(); 312 decoder_thread_task_runner_ = decoder_thread_.task_runner();
313 min_picture_count_ = min_picture_count;
311 314
312 state_ = kIdle; 315 state_ = kIdle;
313 return true; 316 return true;
314 } 317 }
315 318
316 void VaapiVideoDecodeAccelerator::OutputPicture( 319 void VaapiVideoDecodeAccelerator::OutputPicture(
317 const scoped_refptr<VASurface>& va_surface, 320 const scoped_refptr<VASurface>& va_surface,
318 int32 input_id, 321 int32 input_id,
319 VaapiPicture* picture) { 322 VaapiPicture* picture) {
320 DCHECK_EQ(message_loop_, base::MessageLoop::current()); 323 DCHECK_EQ(message_loop_, base::MessageLoop::current());
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after
501 // of having a separate decoder thread. 504 // of having a separate decoder thread.
502 base::AutoUnlock auto_unlock(lock_); 505 base::AutoUnlock auto_unlock(lock_);
503 res = decoder_->Decode(); 506 res = decoder_->Decode();
504 } 507 }
505 508
506 switch (res) { 509 switch (res) {
507 case AcceleratedVideoDecoder::kAllocateNewSurfaces: 510 case AcceleratedVideoDecoder::kAllocateNewSurfaces:
508 DVLOG(1) << "Decoder requesting a new set of surfaces"; 511 DVLOG(1) << "Decoder requesting a new set of surfaces";
509 message_loop_->PostTask(FROM_HERE, base::Bind( 512 message_loop_->PostTask(FROM_HERE, base::Bind(
510 &VaapiVideoDecodeAccelerator::InitiateSurfaceSetChange, weak_this_, 513 &VaapiVideoDecodeAccelerator::InitiateSurfaceSetChange, weak_this_,
511 decoder_->GetRequiredNumOfPictures(), 514 std::max(min_picture_count_,
515 static_cast<uint32_t>(
516 decoder_->GetRequiredNumOfPictures())),
512 decoder_->GetPicSize())); 517 decoder_->GetPicSize()));
513 // We'll get rescheduled once ProvidePictureBuffers() finishes. 518 // We'll get rescheduled once ProvidePictureBuffers() finishes.
514 return; 519 return;
515 520
516 case AcceleratedVideoDecoder::kRanOutOfStreamData: 521 case AcceleratedVideoDecoder::kRanOutOfStreamData:
517 ReturnCurrInputBuffer_Locked(); 522 ReturnCurrInputBuffer_Locked();
518 break; 523 break;
519 524
520 case AcceleratedVideoDecoder::kRanOutOfSurfaces: 525 case AcceleratedVideoDecoder::kRanOutOfSurfaces:
521 // No more output buffers in the decoder, try getting more or go to 526 // No more output buffers in the decoder, try getting more or go to
(...skipping 990 matching lines...) Expand 10 before | Expand all | Expand 10 after
1512 return vaapi_pic->dec_surface(); 1517 return vaapi_pic->dec_surface();
1513 } 1518 }
1514 1519
1515 // static 1520 // static
1516 media::VideoDecodeAccelerator::SupportedProfiles 1521 media::VideoDecodeAccelerator::SupportedProfiles
1517 VaapiVideoDecodeAccelerator::GetSupportedProfiles() { 1522 VaapiVideoDecodeAccelerator::GetSupportedProfiles() {
1518 return VaapiWrapper::GetSupportedDecodeProfiles(); 1523 return VaapiWrapper::GetSupportedDecodeProfiles();
1519 } 1524 }
1520 1525
1521 } // namespace content 1526 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698