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

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

Issue 8294025: Merge 105121 - Numerous fixes to audio/video buffered resource loading. (Closed) Base URL: svn://svn.chromium.org/chrome/branches/874/src/
Patch Set: '' Created 9 years, 2 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
« no previous file with comments | « webkit/glue/media/buffered_data_source.h ('k') | webkit/glue/media/buffered_data_source_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webkit/glue/media/buffered_data_source.cc
===================================================================
--- webkit/glue/media/buffered_data_source.cc (revision 105891)
+++ webkit/glue/media/buffered_data_source.cc (working copy)
@@ -61,9 +61,11 @@
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 @@
return new BufferedResourceLoader(url_,
first_byte_position,
last_byte_position,
+ ChooseDeferStrategy(),
+ bitrate_,
+ playback_rate_,
media_log_);
}
@@ -154,6 +159,11 @@
preload));
}
+void BufferedDataSource::SetBitrate(int bitrate) {
+ render_loop_->PostTask(FROM_HERE,
+ NewRunnableMethod(this, &BufferedDataSource::SetBitrateTask, bitrate));
+}
+
/////////////////////////////////////////////////////////////////////////////
// media::DataSource implementation.
void BufferedDataSource::Read(int64 position, size_t size, uint8* data,
@@ -304,8 +314,6 @@
}
loader_ = CreateResourceLoader(read_position_, kPositionNotSpecified);
- BufferedResourceLoader::DeferStrategy strategy = ChooseDeferStrategy();
- loader_->UpdateDeferStrategy(strategy);
loader_->Start(
NewCallback(this, &BufferedDataSource::PartialReadStartCallback),
NewCallback(this, &BufferedDataSource::NetworkEventCallback),
@@ -316,6 +324,9 @@
DCHECK(MessageLoop::current() == render_loop_);
DCHECK(loader_.get());
+ playback_rate_ = playback_rate;
+ loader_->SetPlaybackRate(playback_rate);
+
bool previously_paused = media_is_paused_;
media_is_paused_ = (playback_rate == 0.0);
@@ -331,25 +342,30 @@
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;
}
@@ -411,7 +427,6 @@
int64 instance_size = loader_->instance_size();
bool success = error == net::OK;
-
bool initialize_cb_is_null = false;
{
base::AutoLock auto_lock(lock_);
« no previous file with comments | « webkit/glue/media/buffered_data_source.h ('k') | webkit/glue/media/buffered_data_source_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698