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

Unified Diff: webkit/glue/media/buffered_resource_loader.cc

Issue 6625059: Implementing preload=metadata for video (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Strategy is enum, not object Created 9 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 side-by-side diff with in-line comments
Download patch
Index: webkit/glue/media/buffered_resource_loader.cc
diff --git a/webkit/glue/media/buffered_resource_loader.cc b/webkit/glue/media/buffered_resource_loader.cc
index c6295bfd12f87e331f2c5fdb74494e50cde6053e..53bfb7bf1c43154c08debb63fb56cda46742a820 100644
--- a/webkit/glue/media/buffered_resource_loader.cc
+++ b/webkit/glue/media/buffered_resource_loader.cc
@@ -11,6 +11,7 @@
#include "third_party/WebKit/Source/WebKit/chromium/public/WebKitClient.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebString.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebURLError.h"
+#include "webkit/glue/media/buffered_data_source.h"
acolwell GONE FROM CHROMIUM 2011/03/25 23:08:14 Do you still need this?
vrk (LEFT CHROMIUM) 2011/03/29 00:53:00 Nope! Removed :)
#include "webkit/glue/multipart_response_delegate.h"
#include "webkit/glue/webkit_glue.h"
@@ -50,7 +51,7 @@ BufferedResourceLoader::BufferedResourceLoader(
int64 last_byte_position)
: buffer_(new media::SeekableBuffer(kBackwardCapcity, kForwardCapacity)),
deferred_(false),
- defer_allowed_(true),
+ defer_strategy_(ReadThenDefer),
completed_(false),
range_requested_(false),
partial_response_(false),
@@ -180,10 +181,15 @@ void BufferedResourceLoader::Read(int64 position,
// If we can serve the request now, do the actual read.
if (CanFulfillRead()) {
ReadInternal();
- DisableDeferIfNeeded();
+ UpdateDeferBehavior();
return;
}
+ // If you're deferred and you can't fulfill the read because you don't have
+ // enough data, you will never fulfill the read.
+ // Update defer behavior to re-enable deferring if need be.
+ UpdateDeferBehavior();
+
// If we expected the read request to be fulfilled later, returns
// immediately and let more data to flow in.
if (WillFulfillRead())
@@ -199,11 +205,6 @@ int64 BufferedResourceLoader::GetBufferedPosition() {
return kPositionNotSpecified;
}
-void BufferedResourceLoader::SetAllowDefer(bool is_allowed) {
- defer_allowed_ = is_allowed;
- DisableDeferIfNeeded();
-}
-
int64 BufferedResourceLoader::content_length() {
return content_length_;
}
@@ -334,21 +335,19 @@ void BufferedResourceLoader::didReceiveData(
buffer_->Append(reinterpret_cast<const uint8*>(data), data_length);
// If there is an active read request, try to fulfill the request.
- if (HasPendingRead() && CanFulfillRead()) {
+ if (HasPendingRead() && CanFulfillRead())
ReadInternal();
- } else if (!defer_allowed_) {
- // If we're not allowed to defer, slide the buffer window forward instead
- // of deferring.
- if (buffer_->forward_bytes() > buffer_->forward_capacity()) {
- size_t excess = buffer_->forward_bytes() - buffer_->forward_capacity();
- bool success = buffer_->Seek(excess);
- DCHECK(success);
- offset_ += first_offset_ + excess;
- }
- }
// At last see if the buffer is full and we need to defer the downloading.
- EnableDeferIfNeeded();
+ UpdateDeferBehavior();
+
+ // Consume excess bytes from our in-memory buffer if necessary.
+ if (buffer_->forward_bytes() > buffer_->forward_capacity()) {
acolwell GONE FROM CHROMIUM 2011/03/25 23:08:14 This looks like a change in behavior. why is this
vrk (LEFT CHROMIUM) 2011/03/29 00:53:00 Ah I meant to tell you about this! Brief storytime
acolwell GONE FROM CHROMIUM 2011/03/29 05:52:03 Ok. I think I understand. It sounds reasonable to
+ size_t excess = buffer_->forward_bytes() - buffer_->forward_capacity();
+ bool success = buffer_->Seek(excess);
+ DCHECK(success);
+ offset_ += first_offset_ + excess;
+ }
// Notify that we have received some data.
NotifyNetworkEvent();
@@ -431,32 +430,80 @@ bool BufferedResourceLoader::HasSingleOrigin() const {
/////////////////////////////////////////////////////////////////////////////
// Helper methods.
-void BufferedResourceLoader::EnableDeferIfNeeded() {
- if (!defer_allowed_)
- return;
+void BufferedResourceLoader::UpdateDeferBehavior() {
+ if ((deferred_ && ShouldDisableDefer()) ||
+ (!deferred_ && ShouldEnableDefer())) {
+ bool eventOccurred = ToggleDeferring();
+ if (eventOccurred)
+ NotifyNetworkEvent();
+ }
+}
- if (!deferred_ &&
- buffer_->forward_bytes() >= buffer_->forward_capacity()) {
- deferred_ = true;
+void BufferedResourceLoader::SetDeferStrategy(DeferStrategy strategy) {
+ defer_strategy_ = strategy;
+}
+
+bool BufferedResourceLoader::ShouldEnableDefer() {
+ // If we're already deferring, then enabling makes no sense.
+ if (deferred_)
+ return false;
- if (url_loader_.get())
- url_loader_->setDefersLoading(true);
+ switch(defer_strategy_) {
+ // Never defer at all, so never enable defer.
+ case NeverDefer:
+ return false;
- NotifyNetworkEvent();
+ // Defer if nothing is being requested.
+ case ReadThenDefer:
+ return !read_callback_.get();
+
+ // Defer if we've reached the max capacity of the threshold.
+ case ThresholdDefer:
+ return buffer_->forward_bytes() >= buffer_->forward_capacity();
}
+ // Otherwise no longer defer.
+ return false;
}
-void BufferedResourceLoader::DisableDeferIfNeeded() {
- if (deferred_ &&
- (!defer_allowed_ ||
- buffer_->forward_bytes() < buffer_->forward_capacity() / 2)) {
- deferred_ = false;
+bool BufferedResourceLoader::ShouldDisableDefer() {
+ // If we're not deferring, then disabling makes no sense.
+ if (!deferred_)
+ return false;
- if (url_loader_.get())
- url_loader_->setDefersLoading(false);
+ switch(defer_strategy_) {
+ // Always disable deferring.
+ case NeverDefer:
+ return true;
+
+ // We have an outstanding read request, and we have not buffered enoug
acolwell GONE FROM CHROMIUM 2011/03/25 23:08:14 enoug -> enough
vrk (LEFT CHROMIUM) 2011/03/29 00:53:00 Done.
+ // yet to fulfill the request; disable defer to get more data.
+ case ReadThenDefer: {
+ size_t amount_buffered = buffer_->forward_bytes();
+ size_t amount_to_read = static_cast<size_t>(read_size_);
+ return read_callback_.get() && amount_buffered < amount_to_read;
+ }
- NotifyNetworkEvent();
+ // We have less than half the capacity of our threshold, so
+ // disable defer to get more data.
+ case ThresholdDefer: {
+ size_t amount_buffered = buffer_->forward_bytes();
+ size_t half_capacity = buffer_->forward_capacity() / 2;
+ return amount_buffered < half_capacity;
+ }
}
+
+ // Otherwise keep deferring.
+ return false;
+}
+
+bool BufferedResourceLoader::ToggleDeferring() {
+ bool newDeferSetting = !deferred_;
+ deferred_ = newDeferSetting;
acolwell GONE FROM CHROMIUM 2011/03/25 23:08:14 deferred_ = !deferred_
vrk (LEFT CHROMIUM) 2011/03/29 00:53:00 Done.
+ if (url_loader_.get()) {
+ url_loader_->setDefersLoading(newDeferSetting);
acolwell GONE FROM CHROMIUM 2011/03/25 23:08:14 deferred_
vrk (LEFT CHROMIUM) 2011/03/29 00:53:00 Done.
+ return true;
+ }
+ return false;
}
bool BufferedResourceLoader::CanFulfillRead() {

Powered by Google App Engine
This is Rietveld 408576698