 Chromium Code Reviews
 Chromium Code Reviews Issue 6625059:
  Implementing preload=metadata for video  (Closed) 
  Base URL: svn://svn.chromium.org/chrome/trunk/src
    
  
    Issue 6625059:
  Implementing preload=metadata for video  (Closed) 
  Base URL: svn://svn.chromium.org/chrome/trunk/src| 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 |