Index: webkit/glue/media/buffered_data_source.cc |
diff --git a/webkit/glue/media/buffered_data_source.cc b/webkit/glue/media/buffered_data_source.cc |
index d0d42aa786fbd95ba6b853cdcabf7936ab35194f..51207919e36dd12a3ffdeee0e80df229c8300002 100644 |
--- a/webkit/glue/media/buffered_data_source.cc |
+++ b/webkit/glue/media/buffered_data_source.cc |
@@ -64,6 +64,8 @@ BufferedDataSource::BufferedDataSource( |
stop_signal_received_(false), |
stopped_on_render_loop_(false), |
media_is_paused_(true), |
+ media_has_played_(false), |
+ preload_(media::METADATA), |
using_range_request_(true) { |
} |
@@ -154,6 +156,12 @@ void BufferedDataSource::SetPlaybackRate(float playback_rate) { |
playback_rate)); |
} |
+void BufferedDataSource::SetPreload(media::Preload preload) { |
+ render_loop_->PostTask(FROM_HERE, |
+ NewRunnableMethod(this, &BufferedDataSource::SetPreloadTask, |
+ preload)); |
+} |
+ |
///////////////////////////////////////////////////////////////////////////// |
// media::DataSource implementation. |
void BufferedDataSource::Read(int64 position, size_t size, uint8* data, |
@@ -310,7 +318,8 @@ void BufferedDataSource::RestartLoadingTask() { |
} |
loader_ = CreateResourceLoader(read_position_, kPositionNotSpecified); |
- loader_->SetAllowDefer(!media_is_paused_); |
+ BufferedResourceLoader::DeferStrategy strategy = ChooseDeferStrategy(); |
+ loader_->UpdateDeferStrategy(strategy); |
loader_->Start( |
NewCallback(this, &BufferedDataSource::PartialReadStartCallback), |
NewCallback(this, &BufferedDataSource::NetworkEventCallback), |
@@ -346,7 +355,8 @@ void BufferedDataSource::WatchDogTask() { |
// retry the request. |
loader_->Stop(); |
loader_ = CreateResourceLoader(read_position_, kPositionNotSpecified); |
- loader_->SetAllowDefer(!media_is_paused_); |
+ BufferedResourceLoader::DeferStrategy strategy = ChooseDeferStrategy(); |
+ loader_->UpdateDeferStrategy(strategy); |
loader_->Start( |
NewCallback(this, &BufferedDataSource::PartialReadStartCallback), |
NewCallback(this, &BufferedDataSource::NetworkEventCallback), |
@@ -360,13 +370,37 @@ void BufferedDataSource::SetPlaybackRateTask(float playback_rate) { |
bool previously_paused = media_is_paused_; |
media_is_paused_ = (playback_rate == 0.0); |
- // Disallow deferring data when we are pausing, allow deferring data |
- // when we resume playing. |
- if (previously_paused && !media_is_paused_) { |
- loader_->SetAllowDefer(true); |
- } else if (!previously_paused && media_is_paused_) { |
- loader_->SetAllowDefer(false); |
+ if (!media_has_played_ && previously_paused && !media_is_paused_) |
+ media_has_played_ = true; |
+ |
+ BufferedResourceLoader::DeferStrategy strategy = ChooseDeferStrategy(); |
+ loader_->UpdateDeferStrategy(strategy); |
+} |
+ |
+void BufferedDataSource::SetPreloadTask(media::Preload preload) { |
+ DCHECK(MessageLoop::current() == render_loop_); |
+ preload_ = preload; |
+} |
+ |
+BufferedResourceLoader::DeferStrategy |
+ BufferedDataSource::ChooseDeferStrategy() { |
scherkus (not reviewing)
2011/04/05 06:22:45
nit: method name should be completely un-indented
vrk (LEFT CHROMIUM)
2011/04/05 16:17:41
Done.
|
+ // 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_) |
+ 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_)) { |
+ 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. |
+ return BufferedResourceLoader::kThresholdDefer; |
} |
// This method is the place where actual read happens, |loader_| must be valid |