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

Side by Side Diff: media/filters/video_renderer_base.cc

Issue 9717021: Make Callback::Reset() return a copy to support use-cases where Run() ends up modifying |*this|. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 8 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/callback.h" 6 #include "base/callback.h"
7 #include "base/threading/platform_thread.h" 7 #include "base/threading/platform_thread.h"
8 #include "media/base/buffers.h" 8 #include "media/base/buffers.h"
9 #include "media/base/filter_host.h" 9 #include "media/base/filter_host.h"
10 #include "media/base/limits.h" 10 #include "media/base/limits.h"
(...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after
355 } 355 }
356 356
357 if (!frame) { 357 if (!frame) {
358 if (state_ != kSeeking) 358 if (state_ != kSeeking)
359 return; 359 return;
360 360
361 // Abort seek early for a NULL frame because we won't get more frames. 361 // Abort seek early for a NULL frame because we won't get more frames.
362 // A new seek will be requested after this one completes so there is no 362 // A new seek will be requested after this one completes so there is no
363 // point trying to collect more frames. 363 // point trying to collect more frames.
364 state_ = kPrerolled; 364 state_ = kPrerolled;
365 ResetAndRunCB(&seek_cb_, PIPELINE_OK); 365 seek_cb_.ResetAndRun(PIPELINE_OK);
366 return; 366 return;
367 } 367 }
368 368
369 // Discard frames until we reach our desired seek timestamp. 369 // Discard frames until we reach our desired seek timestamp.
370 if (state_ == kSeeking && !frame->IsEndOfStream() && 370 if (state_ == kSeeking && !frame->IsEndOfStream() &&
371 (frame->GetTimestamp() + frame->GetDuration()) <= seek_timestamp_) { 371 (frame->GetTimestamp() + frame->GetDuration()) <= seek_timestamp_) {
372 AttemptRead_Locked(); 372 AttemptRead_Locked();
373 return; 373 return;
374 } 374 }
375 375
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
414 // Because we might remain in the prerolled state for an undetermined amount 414 // Because we might remain in the prerolled state for an undetermined amount
415 // of time (i.e., we were not playing before we received a seek), we'll 415 // of time (i.e., we were not playing before we received a seek), we'll
416 // manually update the current frame and notify the subclass below. 416 // manually update the current frame and notify the subclass below.
417 if (!ready_frames_.front()->IsEndOfStream()) { 417 if (!ready_frames_.front()->IsEndOfStream()) {
418 current_frame_ = ready_frames_.front(); 418 current_frame_ = ready_frames_.front();
419 ready_frames_.pop_front(); 419 ready_frames_.pop_front();
420 } 420 }
421 421
422 // ...and we're done seeking! 422 // ...and we're done seeking!
423 DCHECK(!seek_cb_.is_null()); 423 DCHECK(!seek_cb_.is_null());
424 ResetAndRunCB(&seek_cb_, PIPELINE_OK); 424 seek_cb_.ResetAndRun(PIPELINE_OK);
425 425
426 base::AutoUnlock ul(lock_); 426 base::AutoUnlock ul(lock_);
427 paint_cb_.Run(); 427 paint_cb_.Run();
428 } 428 }
429 } 429 }
430 430
431 void VideoRendererBase::AttemptRead_Locked() { 431 void VideoRendererBase::AttemptRead_Locked() {
432 lock_.AssertAcquired(); 432 lock_.AssertAcquired();
433 DCHECK_NE(kEnded, state_); 433 DCHECK_NE(kEnded, state_);
434 434
(...skipping 10 matching lines...) Expand all
445 void VideoRendererBase::AttemptFlush_Locked() { 445 void VideoRendererBase::AttemptFlush_Locked() {
446 lock_.AssertAcquired(); 446 lock_.AssertAcquired();
447 DCHECK_EQ(kFlushing, state_); 447 DCHECK_EQ(kFlushing, state_);
448 448
449 // Get rid of any ready frames. 449 // Get rid of any ready frames.
450 ready_frames_.clear(); 450 ready_frames_.clear();
451 451
452 if (!pending_paint_ && !pending_read_) { 452 if (!pending_paint_ && !pending_read_) {
453 state_ = kFlushed; 453 state_ = kFlushed;
454 current_frame_ = NULL; 454 current_frame_ = NULL;
455 ResetAndRunCB(&flush_cb_); 455 flush_cb_.ResetAndRun();
456 } 456 }
457 } 457 }
458 458
459 base::TimeDelta VideoRendererBase::CalculateSleepDuration( 459 base::TimeDelta VideoRendererBase::CalculateSleepDuration(
460 const scoped_refptr<VideoFrame>& next_frame, 460 const scoped_refptr<VideoFrame>& next_frame,
461 float playback_rate) { 461 float playback_rate) {
462 // Determine the current and next presentation timestamps. 462 // Determine the current and next presentation timestamps.
463 base::TimeDelta now = host()->GetTime(); 463 base::TimeDelta now = host()->GetTime();
464 base::TimeDelta this_pts = current_frame_->GetTimestamp(); 464 base::TimeDelta this_pts = current_frame_->GetTimestamp();
465 base::TimeDelta next_pts; 465 base::TimeDelta next_pts;
(...skipping 20 matching lines...) Expand all
486 486
487 int VideoRendererBase::NumFrames_Locked() const { 487 int VideoRendererBase::NumFrames_Locked() const {
488 lock_.AssertAcquired(); 488 lock_.AssertAcquired();
489 int outstanding_frames = 489 int outstanding_frames =
490 (current_frame_ ? 1 : 0) + (last_available_frame_ ? 1 : 0) + 490 (current_frame_ ? 1 : 0) + (last_available_frame_ ? 1 : 0) +
491 (current_frame_ && (current_frame_ == last_available_frame_) ? -1 : 0); 491 (current_frame_ && (current_frame_ == last_available_frame_) ? -1 : 0);
492 return ready_frames_.size() + outstanding_frames; 492 return ready_frames_.size() + outstanding_frames;
493 } 493 }
494 494
495 } // namespace media 495 } // namespace media
OLDNEW
« base/callback_unittest.cc ('K') | « media/filters/gpu_video_decoder.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698