Chromium Code Reviews| 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..c1592d1a4e25349413cf9b854fed77a52434a7b8 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, |
| @@ -316,7 +324,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), |
| @@ -352,7 +361,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), |
| @@ -366,13 +376,36 @@ 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/03/31 23:40:21
nit: >80 chars
drop the method name onto next lin
vrk (LEFT CHROMIUM)
2011/04/01 22:52:12
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 |