Suppress pause and buffer for local resources

For local resources we do not need to buffer while the player is paused. "Pause and Buffer" amounts to unnecessary transmission between browser and renderer.

BufferedDataSource already knows whether the resource is local or not. This patch changes the defer strategy in BufferedResourceLoader for local resources.

BUG=129120

Review URL: https://codereview.chromium.org/302553006

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@275840 0039d316-1c4b-4281-b951-d872f2087c98
parent 7d8e41a0
......@@ -511,10 +511,9 @@ void BufferedDataSource::ProgressCallback(int64 position) {
}
void BufferedDataSource::UpdateDeferStrategy(bool paused) {
// 200 responses end up not being reused to satisfy future range requests,
// and we don't want to get too far ahead of the read-head (and thus require
// a restart), so keep to the thresholds.
if (!loader_->range_supported()) {
// No need to aggressively buffer when we are assuming the resource is fully
// buffered.
if (assume_fully_buffered()) {
loader_->UpdateDeferStrategy(BufferedResourceLoader::kCapacityDefer);
return;
}
......@@ -523,14 +522,15 @@ void BufferedDataSource::UpdateDeferStrategy(bool paused) {
// and we're paused, then try to load as much as possible (the loader will
// fall back to kCapacityDefer if it knows the current response won't be
// useful from the cache in the future).
if (media_has_played_ && paused) {
if (media_has_played_ && paused && loader_->range_supported()) {
loader_->UpdateDeferStrategy(BufferedResourceLoader::kNeverDefer);
return;
}
// If media is currently playing or the page indicated preload=auto,
// use threshold strategy to enable/disable deferring when the buffer
// is full/depleted.
// If media is currently playing or the page indicated preload=auto or the
// the server does not support the byte range request or we do not want to go
// too far ahead of the read head, use threshold strategy to enable/disable
// deferring when the buffer is full/depleted.
loader_->UpdateDeferStrategy(BufferedResourceLoader::kCapacityDefer);
}
......
......@@ -110,7 +110,9 @@ static const char kFileUrl[] = "file:///tmp/bar.webm";
class BufferedDataSourceTest : public testing::Test {
public:
BufferedDataSourceTest()
: view_(WebView::create(NULL)), frame_(WebLocalFrame::create(&client_)) {
: view_(WebView::create(NULL)),
frame_(WebLocalFrame::create(&client_)),
preload_(AUTO) {
view_->setMainFrame(frame_);
}
......@@ -128,6 +130,7 @@ class BufferedDataSourceTest : public testing::Test {
message_loop_.message_loop_proxy(),
view_->mainFrame()->toWebLocalFrame(),
&host_));
data_source_->SetPreload(preload_);
response_generator_.reset(new TestResponseGenerator(gurl, kFileSize));
ExpectCreateResourceLoader();
......@@ -140,6 +143,14 @@ class BufferedDataSourceTest : public testing::Test {
EXPECT_EQ(data_source_->downloading(), is_http);
}
// Helper to initialize tests with a valid 200 response.
void InitializeWith200Response() {
Initialize(kHttpUrl, true);
EXPECT_CALL(host_, SetTotalBytes(response_generator_->content_length()));
Respond(response_generator_->Generate200());
}
// Helper to initialize tests with a valid 206 response.
void InitializeWith206Response() {
Initialize(kHttpUrl, true);
......@@ -215,6 +226,7 @@ class BufferedDataSourceTest : public testing::Test {
}
Preload preload() { return data_source_->preload_; }
void set_preload(Preload preload) { preload_ = preload; }
BufferedResourceLoader::DeferStrategy defer_strategy() {
return loader()->defer_strategy_;
}
......@@ -222,6 +234,10 @@ class BufferedDataSourceTest : public testing::Test {
int data_source_playback_rate() { return data_source_->playback_rate_; }
int loader_bitrate() { return loader()->bitrate_; }
int loader_playback_rate() { return loader()->playback_rate_; }
bool is_local_source() { return data_source_->assume_fully_buffered(); }
void set_might_be_reused_from_cache_in_future(bool value) {
loader()->might_be_reused_from_cache_in_future_ = value;
}
scoped_ptr<MockBufferedDataSource> data_source_;
......@@ -237,14 +253,13 @@ class BufferedDataSourceTest : public testing::Test {
// Used for calling BufferedDataSource::Read().
uint8 buffer_[kDataSize];
Preload preload_;
DISALLOW_COPY_AND_ASSIGN(BufferedDataSourceTest);
};
TEST_F(BufferedDataSourceTest, Range_Supported) {
Initialize(kHttpUrl, true);
EXPECT_CALL(host_, SetTotalBytes(response_generator_->content_length()));
Respond(response_generator_->Generate206(0));
InitializeWith206Response();
EXPECT_TRUE(data_source_->loading());
EXPECT_FALSE(data_source_->IsStreaming());
......@@ -271,9 +286,7 @@ TEST_F(BufferedDataSourceTest, Range_NotFound) {
}
TEST_F(BufferedDataSourceTest, Range_NotSupported) {
Initialize(kHttpUrl, true);
EXPECT_CALL(host_, SetTotalBytes(response_generator_->content_length()));
Respond(response_generator_->Generate200());
InitializeWith200Response();
EXPECT_TRUE(data_source_->loading());
EXPECT_TRUE(data_source_->IsStreaming());
......@@ -672,4 +685,121 @@ TEST_F(BufferedDataSourceTest, File_FinishLoading) {
Stop();
}
TEST_F(BufferedDataSourceTest, LocalResource_DeferStrategy) {
InitializeWithFileResponse();
EXPECT_EQ(AUTO, preload());
EXPECT_TRUE(is_local_source());
EXPECT_EQ(BufferedResourceLoader::kCapacityDefer, defer_strategy());
data_source_->MediaIsPlaying();
EXPECT_EQ(BufferedResourceLoader::kCapacityDefer, defer_strategy());
data_source_->MediaIsPaused();
EXPECT_EQ(BufferedResourceLoader::kCapacityDefer, defer_strategy());
Stop();
}
TEST_F(BufferedDataSourceTest, LocalResource_PreloadMetadata_DeferStrategy) {
set_preload(METADATA);
InitializeWithFileResponse();
EXPECT_EQ(METADATA, preload());
EXPECT_TRUE(is_local_source());
EXPECT_EQ(BufferedResourceLoader::kReadThenDefer, defer_strategy());
data_source_->MediaIsPlaying();
EXPECT_EQ(BufferedResourceLoader::kCapacityDefer, defer_strategy());
data_source_->MediaIsPaused();
EXPECT_EQ(BufferedResourceLoader::kCapacityDefer, defer_strategy());
Stop();
}
TEST_F(BufferedDataSourceTest, ExternalResource_Reponse200_DeferStrategy) {
InitializeWith200Response();
EXPECT_EQ(AUTO, preload());
EXPECT_FALSE(is_local_source());
EXPECT_FALSE(loader()->range_supported());
EXPECT_EQ(BufferedResourceLoader::kCapacityDefer, defer_strategy());
data_source_->MediaIsPlaying();
EXPECT_EQ(BufferedResourceLoader::kCapacityDefer, defer_strategy());
data_source_->MediaIsPaused();
EXPECT_EQ(BufferedResourceLoader::kCapacityDefer, defer_strategy());
Stop();
}
TEST_F(BufferedDataSourceTest,
ExternalResource_Response200_PreloadMetadata_DeferStrategy) {
set_preload(METADATA);
InitializeWith200Response();
EXPECT_EQ(METADATA, preload());
EXPECT_FALSE(is_local_source());
EXPECT_FALSE(loader()->range_supported());
EXPECT_EQ(BufferedResourceLoader::kReadThenDefer, defer_strategy());
data_source_->MediaIsPlaying();
EXPECT_EQ(BufferedResourceLoader::kCapacityDefer, defer_strategy());
data_source_->MediaIsPaused();
EXPECT_EQ(BufferedResourceLoader::kCapacityDefer, defer_strategy());
Stop();
}
TEST_F(BufferedDataSourceTest, ExternalResource_Reponse206_DeferStrategy) {
InitializeWith206Response();
EXPECT_EQ(AUTO, preload());
EXPECT_FALSE(is_local_source());
EXPECT_TRUE(loader()->range_supported());
EXPECT_EQ(BufferedResourceLoader::kCapacityDefer, defer_strategy());
data_source_->MediaIsPlaying();
EXPECT_EQ(BufferedResourceLoader::kCapacityDefer, defer_strategy());
set_might_be_reused_from_cache_in_future(true);
data_source_->MediaIsPaused();
EXPECT_EQ(BufferedResourceLoader::kNeverDefer, defer_strategy());
data_source_->MediaIsPlaying();
EXPECT_EQ(BufferedResourceLoader::kCapacityDefer, defer_strategy());
set_might_be_reused_from_cache_in_future(false);
data_source_->MediaIsPaused();
EXPECT_EQ(BufferedResourceLoader::kCapacityDefer, defer_strategy());
Stop();
}
TEST_F(BufferedDataSourceTest,
ExternalResource_Response206_PreloadMetadata_DeferStrategy) {
set_preload(METADATA);
InitializeWith206Response();
EXPECT_EQ(METADATA, preload());
EXPECT_FALSE(is_local_source());
EXPECT_TRUE(loader()->range_supported());
EXPECT_EQ(BufferedResourceLoader::kReadThenDefer, defer_strategy());
data_source_->MediaIsPlaying();
EXPECT_EQ(BufferedResourceLoader::kCapacityDefer, defer_strategy());
set_might_be_reused_from_cache_in_future(true);
data_source_->MediaIsPaused();
EXPECT_EQ(BufferedResourceLoader::kNeverDefer, defer_strategy());
data_source_->MediaIsPlaying();
EXPECT_EQ(BufferedResourceLoader::kCapacityDefer, defer_strategy());
set_might_be_reused_from_cache_in_future(false);
data_source_->MediaIsPaused();
EXPECT_EQ(BufferedResourceLoader::kCapacityDefer, defer_strategy());
Stop();
}
} // namespace content
......@@ -389,7 +389,7 @@ void BufferedResourceLoader::didReceiveResponse(
// received a response from HTTP/HTTPS protocol or the request was
// successful (in particular range request). So we only verify the partial
// response for HTTP and HTTPS protocol.
if (url_.SchemeIs(url::kHttpScheme) || url_.SchemeIs(url::kHttpsScheme)) {
if (url_.SchemeIsHTTPOrHTTPS()) {
bool partial_response = (response.httpStatusCode() == kHttpPartialContent);
bool ok_response = (response.httpStatusCode() == kHttpOK);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment