| 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
|
|
|