summaryrefslogtreecommitdiffstats
path: root/webkit/glue/media/buffered_data_source.cc
diff options
context:
space:
mode:
authorscherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-10-12 18:00:46 +0000
committerscherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-10-12 18:00:46 +0000
commitcb488d456884a965b322ede8457aca0f0d50950f (patch)
tree3af304b5058f545bfd053dcaa82ce41ee192c44a /webkit/glue/media/buffered_data_source.cc
parent0d69ad5f0c2c3895798d88368669861388acb8c0 (diff)
downloadchromium_src-cb488d456884a965b322ede8457aca0f0d50950f.zip
chromium_src-cb488d456884a965b322ede8457aca0f0d50950f.tar.gz
chromium_src-cb488d456884a965b322ede8457aca0f0d50950f.tar.bz2
Numerous fixes to audio/video buffered resource loading.
This patch fixes a few related issues: 1) Default loading strategy is now threshold-then-defer 2) Specify more reasonable default bitrate/playback rate values 3) Use a minimum buffer window size to prevent underflows on low bitrate content 4) Remember bitrate/playback rate values between resource loaders The default loading strategy of read-then-defer had a negative impact on initial latency as we were constantly deferring/undeferring the connection during the time when we need data the fastest. While this change does result in loading a pinch more data for preload=metadata scenarios, it vastly improves the common preload=auto scenario. BUG=99775 TEST=test_shell_tests Review URL: http://codereview.chromium.org/8224028 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@105121 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit/glue/media/buffered_data_source.cc')
-rw-r--r--webkit/glue/media/buffered_data_source.cc34
1 files changed, 18 insertions, 16 deletions
diff --git a/webkit/glue/media/buffered_data_source.cc b/webkit/glue/media/buffered_data_source.cc
index 4f90442..407a73a 100644
--- a/webkit/glue/media/buffered_data_source.cc
+++ b/webkit/glue/media/buffered_data_source.cc
@@ -61,9 +61,11 @@ BufferedDataSource::BufferedDataSource(
stopped_on_render_loop_(false),
media_is_paused_(true),
media_has_played_(false),
- preload_(media::METADATA),
+ preload_(media::AUTO),
using_range_request_(true),
cache_miss_retries_left_(kNumCacheMissRetries),
+ bitrate_(0),
+ playback_rate_(0.0),
media_log_(media_log) {
}
@@ -79,6 +81,9 @@ BufferedResourceLoader* BufferedDataSource::CreateResourceLoader(
return new BufferedResourceLoader(url_,
first_byte_position,
last_byte_position,
+ ChooseDeferStrategy(),
+ bitrate_,
+ playback_rate_,
media_log_);
}
@@ -304,8 +309,6 @@ void BufferedDataSource::RestartLoadingTask() {
}
loader_ = CreateResourceLoader(read_position_, kPositionNotSpecified);
- BufferedResourceLoader::DeferStrategy strategy = ChooseDeferStrategy();
- loader_->UpdateDeferStrategy(strategy);
loader_->Start(
NewCallback(this, &BufferedDataSource::PartialReadStartCallback),
base::Bind(&BufferedDataSource::NetworkEventCallback, this),
@@ -316,6 +319,7 @@ void BufferedDataSource::SetPlaybackRateTask(float playback_rate) {
DCHECK(MessageLoop::current() == render_loop_);
DCHECK(loader_.get());
+ playback_rate_ = playback_rate;
loader_->SetPlaybackRate(playback_rate);
bool previously_paused = media_is_paused_;
@@ -336,28 +340,27 @@ void BufferedDataSource::SetPreloadTask(media::Preload preload) {
void BufferedDataSource::SetBitrateTask(int bitrate) {
DCHECK(MessageLoop::current() == render_loop_);
DCHECK(loader_.get());
+
+ bitrate_ = bitrate;
loader_->SetBitrate(bitrate);
}
BufferedResourceLoader::DeferStrategy
BufferedDataSource::ChooseDeferStrategy() {
DCHECK(MessageLoop::current() == render_loop_);
- // If the user indicates preload=metadata, then just load exactly
- // what is needed for starting the pipeline and prerolling frames.
- if (preload_ == media::METADATA && !media_has_played_)
+ // If the page indicated preload=metadata, then load exactly what is needed
+ // needed for starting playback.
+ if (!media_has_played_ && preload_ == media::METADATA)
return BufferedResourceLoader::kReadThenDefer;
- // In general, we want to try to buffer the entire video when the video
- // is paused. But we don't want to do this if the video hasn't played yet
- // and preload!=auto.
- if (media_is_paused_ &&
- (preload_ == media::AUTO || media_has_played_)) {
+ // If the playback has started (at which point the preload value is ignored)
+ // and we're paused, then try to load as much as possible.
+ if (media_has_played_ && media_is_paused_)
return BufferedResourceLoader::kNeverDefer;
- }
- // When the video is playing, regardless of preload state, we buffer up
- // to a hard limit and enable/disable deferring when the buffer is
- // depleted/full.
+ // If media is currently playing or the page indicated preload=auto,
+ // use threshold strategy to enable/disable deferring when the buffer
+ // is full/depleted.
return BufferedResourceLoader::kThresholdDefer;
}
@@ -418,7 +421,6 @@ void BufferedDataSource::HttpInitialStartCallback(int error) {
int64 instance_size = loader_->instance_size();
bool success = error == net::OK;
-
bool initialize_cb_is_null = false;
{
base::AutoLock auto_lock(lock_);