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 "webkit/media/buffered_resource_loader.h" | 5 #include "webkit/media/buffered_resource_loader.h" |
6 | 6 |
7 #include "base/bits.h" | 7 #include "base/bits.h" |
8 #include "base/callback_helpers.h" | 8 #include "base/callback_helpers.h" |
9 #include "base/format_macros.h" | 9 #include "base/format_macros.h" |
10 #include "base/metrics/histogram.h" | 10 #include "base/metrics/histogram.h" |
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
292 // capacity. | 292 // capacity. |
293 // | 293 // |
294 // This can happen when reading in a large seek index or when the | 294 // This can happen when reading in a large seek index or when the |
295 // first byte of a read request falls within kForwardWaitThreshold. | 295 // first byte of a read request falls within kForwardWaitThreshold. |
296 if (last_offset_ > buffer_.forward_capacity()) { | 296 if (last_offset_ > buffer_.forward_capacity()) { |
297 saved_forward_capacity_ = buffer_.forward_capacity(); | 297 saved_forward_capacity_ = buffer_.forward_capacity(); |
298 buffer_.set_forward_capacity(last_offset_); | 298 buffer_.set_forward_capacity(last_offset_); |
299 } | 299 } |
300 | 300 |
301 // Make sure we stop deferring now that there's additional capacity. | 301 // Make sure we stop deferring now that there's additional capacity. |
302 if (active_loader_->deferred()) | 302 DCHECK(!ShouldDefer()) |
303 SetDeferred(false); | |
304 | |
305 DCHECK(!ShouldEnableDefer()) | |
306 << "Capacity was not adjusted properly to prevent deferring."; | 303 << "Capacity was not adjusted properly to prevent deferring."; |
| 304 UpdateDeferBehavior(); |
307 | 305 |
308 return; | 306 return; |
309 } | 307 } |
310 | 308 |
311 // Make a callback to report failure. | 309 // Make a callback to report failure. |
312 DoneRead(kCacheMiss, 0); | 310 DoneRead(kCacheMiss, 0); |
313 } | 311 } |
314 | 312 |
315 int64 BufferedResourceLoader::content_length() { | 313 int64 BufferedResourceLoader::content_length() { |
316 return content_length_; | 314 return content_length_; |
(...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
599 // than the current capacities; the new limits will be enforced after the | 597 // than the current capacities; the new limits will be enforced after the |
600 // existing excess buffered data is consumed. | 598 // existing excess buffered data is consumed. |
601 buffer_.set_backward_capacity(backward_capacity); | 599 buffer_.set_backward_capacity(backward_capacity); |
602 buffer_.set_forward_capacity(forward_capacity); | 600 buffer_.set_forward_capacity(forward_capacity); |
603 } | 601 } |
604 | 602 |
605 void BufferedResourceLoader::UpdateDeferBehavior() { | 603 void BufferedResourceLoader::UpdateDeferBehavior() { |
606 if (!active_loader_.get()) | 604 if (!active_loader_.get()) |
607 return; | 605 return; |
608 | 606 |
609 // If necessary, toggle defer state and continue/pause downloading data | 607 SetDeferred(ShouldDefer()); |
610 // accordingly. | |
611 if (ShouldEnableDefer() || ShouldDisableDefer()) | |
612 SetDeferred(!active_loader_->deferred()); | |
613 } | 608 } |
614 | 609 |
615 void BufferedResourceLoader::SetDeferred(bool deferred) { | 610 void BufferedResourceLoader::SetDeferred(bool deferred) { |
| 611 if (active_loader_->deferred() == deferred) |
| 612 return; |
| 613 |
616 active_loader_->SetDeferred(deferred); | 614 active_loader_->SetDeferred(deferred); |
617 loading_cb_.Run(deferred ? kLoadingDeferred : kLoading); | 615 loading_cb_.Run(deferred ? kLoadingDeferred : kLoading); |
618 } | 616 } |
619 | 617 |
620 bool BufferedResourceLoader::ShouldEnableDefer() const { | 618 bool BufferedResourceLoader::ShouldDefer() const { |
621 // If we're already deferring, then enabling makes no sense. | |
622 if (active_loader_->deferred()) | |
623 return false; | |
624 | |
625 switch(defer_strategy_) { | 619 switch(defer_strategy_) { |
626 // Never defer at all, so never enable defer. | |
627 case kNeverDefer: | 620 case kNeverDefer: |
628 return false; | 621 return false; |
629 | 622 |
630 // Defer if nothing is being requested. | |
631 case kReadThenDefer: | 623 case kReadThenDefer: |
| 624 DCHECK(read_cb_.is_null() || last_offset_ > buffer_.forward_bytes()) |
| 625 << "We shouldn't stop deferring if we can fulfill the read"; |
632 return read_cb_.is_null(); | 626 return read_cb_.is_null(); |
633 | 627 |
634 // Defer if we've reached max capacity. | |
635 case kCapacityDefer: | 628 case kCapacityDefer: |
636 return buffer_.forward_bytes() >= buffer_.forward_capacity(); | 629 return buffer_.forward_bytes() >= buffer_.forward_capacity(); |
637 } | 630 } |
638 // Otherwise don't enable defer. | 631 NOTREACHED(); |
639 return false; | 632 return false; |
640 } | 633 } |
641 | 634 |
642 bool BufferedResourceLoader::ShouldDisableDefer() const { | |
643 // If we're not deferring, then disabling makes no sense. | |
644 if (!active_loader_->deferred()) | |
645 return false; | |
646 | |
647 switch(defer_strategy_) { | |
648 // Always disable deferring. | |
649 case kNeverDefer: | |
650 return true; | |
651 | |
652 // We have an outstanding read request, and we have not buffered enough | |
653 // yet to fulfill the request; disable defer to get more data. | |
654 case kReadThenDefer: | |
655 return !read_cb_.is_null() && last_offset_ > buffer_.forward_bytes(); | |
656 | |
657 // Disable deferring whenever our forward-buffered amount falls beneath our | |
658 // capacity. | |
659 case kCapacityDefer: | |
660 return buffer_.forward_bytes() < buffer_.forward_capacity(); | |
661 } | |
662 | |
663 // Otherwise keep deferring. | |
664 return false; | |
665 } | |
666 | |
667 bool BufferedResourceLoader::CanFulfillRead() const { | 635 bool BufferedResourceLoader::CanFulfillRead() const { |
668 // If we are reading too far in the backward direction. | 636 // If we are reading too far in the backward direction. |
669 if (first_offset_ < 0 && (first_offset_ + buffer_.backward_bytes()) < 0) | 637 if (first_offset_ < 0 && (first_offset_ + buffer_.backward_bytes()) < 0) |
670 return false; | 638 return false; |
671 | 639 |
672 // If the start offset is too far ahead. | 640 // If the start offset is too far ahead. |
673 if (first_offset_ >= buffer_.forward_bytes()) | 641 if (first_offset_ >= buffer_.forward_bytes()) |
674 return false; | 642 return false; |
675 | 643 |
676 // At the point, we verified that first byte requested is within the buffer. | 644 // At the point, we verified that first byte requested is within the buffer. |
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
831 | 799 |
832 void BufferedResourceLoader::Log() { | 800 void BufferedResourceLoader::Log() { |
833 media_log_->AddEvent( | 801 media_log_->AddEvent( |
834 media_log_->CreateBufferedExtentsChangedEvent( | 802 media_log_->CreateBufferedExtentsChangedEvent( |
835 offset_ - buffer_.backward_bytes(), | 803 offset_ - buffer_.backward_bytes(), |
836 offset_, | 804 offset_, |
837 offset_ + buffer_.forward_bytes())); | 805 offset_ + buffer_.forward_bytes())); |
838 } | 806 } |
839 | 807 |
840 } // namespace webkit_media | 808 } // namespace webkit_media |
OLD | NEW |