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_); |