OLD | NEW |
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 349 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
360 } | 360 } |
361 | 361 |
362 if (!frame) { | 362 if (!frame) { |
363 if (state_ != kSeeking) | 363 if (state_ != kSeeking) |
364 return; | 364 return; |
365 | 365 |
366 // Abort seek early for a NULL frame because we won't get more frames. | 366 // Abort seek early for a NULL frame because we won't get more frames. |
367 // A new seek will be requested after this one completes so there is no | 367 // A new seek will be requested after this one completes so there is no |
368 // point trying to collect more frames. | 368 // point trying to collect more frames. |
369 state_ = kPrerolled; | 369 state_ = kPrerolled; |
370 ResetAndRunCB(&seek_cb_, PIPELINE_OK); | 370 seek_cb_.ResetAndRun(PIPELINE_OK); |
371 return; | 371 return; |
372 } | 372 } |
373 | 373 |
374 // Discard frames until we reach our desired seek timestamp. | 374 // Discard frames until we reach our desired seek timestamp. |
375 if (state_ == kSeeking && !frame->IsEndOfStream() && | 375 if (state_ == kSeeking && !frame->IsEndOfStream() && |
376 (frame->GetTimestamp() + frame->GetDuration()) <= seek_timestamp_) { | 376 (frame->GetTimestamp() + frame->GetDuration()) <= seek_timestamp_) { |
377 AttemptRead_Locked(); | 377 AttemptRead_Locked(); |
378 return; | 378 return; |
379 } | 379 } |
380 | 380 |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
419 // Because we might remain in the prerolled state for an undetermined amount | 419 // Because we might remain in the prerolled state for an undetermined amount |
420 // of time (i.e., we were not playing before we received a seek), we'll | 420 // of time (i.e., we were not playing before we received a seek), we'll |
421 // manually update the current frame and notify the subclass below. | 421 // manually update the current frame and notify the subclass below. |
422 if (!ready_frames_.front()->IsEndOfStream()) { | 422 if (!ready_frames_.front()->IsEndOfStream()) { |
423 current_frame_ = ready_frames_.front(); | 423 current_frame_ = ready_frames_.front(); |
424 ready_frames_.pop_front(); | 424 ready_frames_.pop_front(); |
425 } | 425 } |
426 | 426 |
427 // ...and we're done seeking! | 427 // ...and we're done seeking! |
428 DCHECK(!seek_cb_.is_null()); | 428 DCHECK(!seek_cb_.is_null()); |
429 ResetAndRunCB(&seek_cb_, PIPELINE_OK); | 429 seek_cb_.ResetAndRun(PIPELINE_OK); |
430 | 430 |
431 base::AutoUnlock ul(lock_); | 431 base::AutoUnlock ul(lock_); |
432 paint_cb_.Run(); | 432 paint_cb_.Run(); |
433 } | 433 } |
434 } | 434 } |
435 | 435 |
436 void VideoRendererBase::AttemptRead_Locked() { | 436 void VideoRendererBase::AttemptRead_Locked() { |
437 lock_.AssertAcquired(); | 437 lock_.AssertAcquired(); |
438 DCHECK_NE(kEnded, state_); | 438 DCHECK_NE(kEnded, state_); |
439 | 439 |
(...skipping 10 matching lines...) Expand all Loading... |
450 void VideoRendererBase::AttemptFlush_Locked() { | 450 void VideoRendererBase::AttemptFlush_Locked() { |
451 lock_.AssertAcquired(); | 451 lock_.AssertAcquired(); |
452 DCHECK_EQ(kFlushing, state_); | 452 DCHECK_EQ(kFlushing, state_); |
453 | 453 |
454 // Get rid of any ready frames. | 454 // Get rid of any ready frames. |
455 ready_frames_.clear(); | 455 ready_frames_.clear(); |
456 | 456 |
457 if (!pending_paint_ && !pending_read_) { | 457 if (!pending_paint_ && !pending_read_) { |
458 state_ = kFlushed; | 458 state_ = kFlushed; |
459 current_frame_ = NULL; | 459 current_frame_ = NULL; |
460 ResetAndRunCB(&flush_cb_); | 460 flush_cb_.ResetAndRun(); |
461 } | 461 } |
462 } | 462 } |
463 | 463 |
464 base::TimeDelta VideoRendererBase::CalculateSleepDuration( | 464 base::TimeDelta VideoRendererBase::CalculateSleepDuration( |
465 const scoped_refptr<VideoFrame>& next_frame, | 465 const scoped_refptr<VideoFrame>& next_frame, |
466 float playback_rate) { | 466 float playback_rate) { |
467 // Determine the current and next presentation timestamps. | 467 // Determine the current and next presentation timestamps. |
468 base::TimeDelta now = host()->GetTime(); | 468 base::TimeDelta now = host()->GetTime(); |
469 base::TimeDelta this_pts = current_frame_->GetTimestamp(); | 469 base::TimeDelta this_pts = current_frame_->GetTimestamp(); |
470 base::TimeDelta next_pts; | 470 base::TimeDelta next_pts; |
(...skipping 20 matching lines...) Expand all Loading... |
491 | 491 |
492 int VideoRendererBase::NumFrames_Locked() const { | 492 int VideoRendererBase::NumFrames_Locked() const { |
493 lock_.AssertAcquired(); | 493 lock_.AssertAcquired(); |
494 int outstanding_frames = | 494 int outstanding_frames = |
495 (current_frame_ ? 1 : 0) + (last_available_frame_ ? 1 : 0) + | 495 (current_frame_ ? 1 : 0) + (last_available_frame_ ? 1 : 0) + |
496 (current_frame_ && (current_frame_ == last_available_frame_) ? -1 : 0); | 496 (current_frame_ && (current_frame_ == last_available_frame_) ? -1 : 0); |
497 return ready_frames_.size() + outstanding_frames; | 497 return ready_frames_.size() + outstanding_frames; |
498 } | 498 } |
499 | 499 |
500 } // namespace media | 500 } // namespace media |
OLD | NEW |