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 26222554bbf7a16ef1537a341af421264addaa7a..732a4131f41bf7e22fce495416c42febedd7949a 100644 |
--- a/webkit/glue/media/buffered_data_source.cc |
+++ b/webkit/glue/media/buffered_data_source.cc |
@@ -7,6 +7,7 @@ |
#include "media/base/filter_host.h" |
#include "net/base/net_errors.h" |
#include "webkit/glue/media/web_data_source_factory.h" |
+#include "webkit/glue/media/defer_strategy.h" |
#include "webkit/glue/webkit_glue.h" |
using WebKit::WebFrame; |
@@ -64,6 +65,8 @@ BufferedDataSource::BufferedDataSource( |
stop_signal_received_(false), |
stopped_on_render_loop_(false), |
media_is_paused_(true), |
+ media_has_played_(false), |
+ preload_(media::PRELOAD_METADATA), |
using_range_request_(true) { |
} |
@@ -154,6 +157,32 @@ void BufferedDataSource::SetPlaybackRate(float playback_rate) { |
playback_rate)); |
} |
+void BufferedDataSource::SetPreload(media::Preload preload) { |
+ render_loop_->PostTask(FROM_HERE, |
+ NewRunnableMethod(this, &BufferedDataSource::SetPreloadTask, |
+ preload)); |
+} |
+ |
+DeferStrategy* BufferedDataSource::ChooseDeferStrategy() { |
+ // If the user indicates preload=metadata, then just load exactly |
+ // what is needed for starting the pipeline and prerolling frames. |
+ if (preload_ == media::PRELOAD_METADATA && !media_has_played_) |
+ return ReadThenDeferStrategy::GetInstance(); |
+ |
+ // 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::PRELOAD_AUTO || media_has_played_)) { |
+ return NeverDeferStrategy::GetInstance(); |
+ } |
+ |
+ // 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 ThresholdDeferStrategy::GetInstance(); |
+} |
+ |
///////////////////////////////////////////////////////////////////////////// |
// media::DataSource implementation. |
void BufferedDataSource::Read(int64 position, size_t size, uint8* data, |
@@ -316,7 +345,7 @@ void BufferedDataSource::RestartLoadingTask() { |
} |
loader_ = CreateResourceLoader(read_position_, kPositionNotSpecified); |
- loader_->SetAllowDefer(!media_is_paused_); |
+ loader_->UpdateDeferStrategy(this); |
loader_->Start( |
NewCallback(this, &BufferedDataSource::PartialReadStartCallback), |
NewCallback(this, &BufferedDataSource::NetworkEventCallback), |
@@ -352,7 +381,7 @@ void BufferedDataSource::WatchDogTask() { |
// retry the request. |
loader_->Stop(); |
loader_ = CreateResourceLoader(read_position_, kPositionNotSpecified); |
- loader_->SetAllowDefer(!media_is_paused_); |
+ loader_->UpdateDeferStrategy(this); |
loader_->Start( |
NewCallback(this, &BufferedDataSource::PartialReadStartCallback), |
NewCallback(this, &BufferedDataSource::NetworkEventCallback), |
@@ -366,13 +395,15 @@ 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; |
+ |
+ loader_->UpdateDeferStrategy(this); |
+} |
+ |
+void BufferedDataSource::SetPreloadTask(media::Preload preload) { |
+ DCHECK(MessageLoop::current() == render_loop_); |
+ preload_ = preload; |
} |
// This method is the place where actual read happens, |loader_| must be valid |