diff options
author | scherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-10-12 18:00:46 +0000 |
---|---|---|
committer | scherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-10-12 18:00:46 +0000 |
commit | cb488d456884a965b322ede8457aca0f0d50950f (patch) | |
tree | 3af304b5058f545bfd053dcaa82ce41ee192c44a /webkit/glue/media/buffered_data_source.cc | |
parent | 0d69ad5f0c2c3895798d88368669861388acb8c0 (diff) | |
download | chromium_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.cc | 34 |
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_); |