Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(21)

Unified Diff: webkit/glue/media/buffered_data_source.cc

Issue 6625059: Implementing preload=metadata for video (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fixed tests and added unit tests Created 9 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « webkit/glue/media/buffered_data_source.h ('k') | webkit/glue/media/buffered_resource_loader.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « webkit/glue/media/buffered_data_source.h ('k') | webkit/glue/media/buffered_resource_loader.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698