summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
authorvrk@google.com <vrk@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2011-04-05 16:28:20 +0000
committervrk@google.com <vrk@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2011-04-05 16:28:20 +0000
commit23a8b1d8f4c8c3b3c37811f310891256f45c8063 (patch)
tree3576777d4ec689cbba94c172f92ee5ed1e3077f9 /media
parent702b280dbaa67b88d0b07da22dc73f2f3116afee (diff)
downloadchromium_src-23a8b1d8f4c8c3b3c37811f310891256f45c8063.zip
chromium_src-23a8b1d8f4c8c3b3c37811f310891256f45c8063.tar.gz
chromium_src-23a8b1d8f4c8c3b3c37811f310891256f45c8063.tar.bz2
Implementing preload=metadata for video
This patch implements the logic necessary to respect the preload attribute when it is set to MetaData. This also refactors the BufferedResourceLoader to determine its buffering techniques based on a DeferStrategy value. BUG=16482,76555 TEST=media/video-preload.html, test_shell_tests Review URL: http://codereview.chromium.org/6625059 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@80465 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media')
-rw-r--r--media/base/filters.h19
-rw-r--r--media/base/mock_filters.h2
-rw-r--r--media/base/pipeline.h4
-rw-r--r--media/base/pipeline_impl.cc32
-rw-r--r--media/base/pipeline_impl.h15
-rw-r--r--media/filters/adaptive_demuxer.cc2
-rw-r--r--media/filters/adaptive_demuxer.h1
-rw-r--r--media/filters/ffmpeg_demuxer.cc10
-rw-r--r--media/filters/ffmpeg_demuxer.h2
-rw-r--r--media/filters/file_data_source.cc2
-rw-r--r--media/filters/file_data_source.h1
11 files changed, 85 insertions, 5 deletions
diff --git a/media/base/filters.h b/media/base/filters.h
index ebe46e5..7d56114 100644
--- a/media/base/filters.h
+++ b/media/base/filters.h
@@ -45,6 +45,19 @@ class FilterHost;
struct PipelineStatistics;
+// Used to specify video preload states. They are "hints" to the browser about
+// how aggressively the browser should load and buffer data.
+// Please see the HTML5 spec for the descriptions of these values:
+// http://www.w3.org/TR/html5/video.html#attr-media-preload
+//
+// Enum values must match the values in WebCore::MediaPlayer::Preload and
+// there will be assertions at compile time if they do not match.
+enum Preload {
+ NONE,
+ METADATA,
+ AUTO,
+};
+
// Used for completing asynchronous methods.
typedef Callback0::Type FilterCallback;
@@ -129,6 +142,9 @@ class DataSource : public Filter {
// Returns true if we are performing streaming. In this case seeking is
// not possible.
virtual bool IsStreaming() = 0;
+
+ // Alert the DataSource that the video preload value has been changed.
+ virtual void SetPreload(Preload preload) = 0;
};
class DemuxerStream : public base::RefCountedThreadSafe<DemuxerStream> {
@@ -166,6 +182,9 @@ class Demuxer : public Filter {
public:
// Returns the given stream type, or NULL if that type is not present.
virtual scoped_refptr<DemuxerStream> GetStream(DemuxerStream::Type type) = 0;
+
+ // Alert the Demuxer that the video preload value has been changed.
+ virtual void SetPreload(Preload preload) = 0;
};
diff --git a/media/base/mock_filters.h b/media/base/mock_filters.h
index 205218f..636b60f 100644
--- a/media/base/mock_filters.h
+++ b/media/base/mock_filters.h
@@ -81,6 +81,7 @@ class MockDataSource : public DataSource {
MOCK_METHOD4(Read, void(int64 position, size_t size, uint8* data,
DataSource::ReadCallback* callback));
MOCK_METHOD1(GetSize, bool(int64* size_out));
+ MOCK_METHOD1(SetPreload, void(Preload preload));
MOCK_METHOD0(IsStreaming, bool());
// Sets the TotalBytes & BufferedBytes values to be sent to host() when
@@ -104,6 +105,7 @@ class MockDemuxer : public Demuxer {
virtual void set_host(FilterHost* host);
MOCK_METHOD1(Stop, void(FilterCallback* callback));
MOCK_METHOD1(SetPlaybackRate, void(float playback_rate));
+ MOCK_METHOD1(SetPreload, void(Preload preload));
MOCK_METHOD2(Seek, void(base::TimeDelta time, FilterCallback* callback));
MOCK_METHOD0(OnAudioRendererDisabled, void());
diff --git a/media/base/pipeline.h b/media/base/pipeline.h
index 0df1bd3..ca7727a 100644
--- a/media/base/pipeline.h
+++ b/media/base/pipeline.h
@@ -12,6 +12,7 @@
#include <string>
#include "base/callback.h"
+#include "media/base/filters.h"
#include "media/base/pipeline_status.h"
namespace base {
@@ -124,6 +125,9 @@ class Pipeline : public base::RefCountedThreadSafe<Pipeline> {
// channels proportionately for multi-channel audio streams.
virtual void SetVolume(float volume) = 0;
+ // Set the preload value for the pipeline.
+ virtual void SetPreload(Preload preload) = 0;
+
// Gets the current pipeline time. For a pipeline "time" progresses from 0 to
// the end of the media.
virtual base::TimeDelta GetCurrentTime() const = 0;
diff --git a/media/base/pipeline_impl.cc b/media/base/pipeline_impl.cc
index 7f5f3f3..2555bd7 100644
--- a/media/base/pipeline_impl.cc
+++ b/media/base/pipeline_impl.cc
@@ -55,7 +55,6 @@ media::PipelineStatus PipelineStatusNotification::status() {
class PipelineImpl::PipelineInitState {
public:
- scoped_refptr<Demuxer> demuxer_;
scoped_refptr<AudioDecoder> audio_decoder_;
scoped_refptr<VideoDecoder> video_decoder_;
scoped_refptr<CompositeFilter> composite_;
@@ -219,6 +218,21 @@ void PipelineImpl::SetVolume(float volume) {
}
}
+Preload PipelineImpl::GetPreload() const {
+ base::AutoLock auto_lock(lock_);
+ return preload_;
+}
+
+void PipelineImpl::SetPreload(Preload preload) {
+ base::AutoLock auto_lock(lock_);
+ preload_ = preload;
+ if (running_) {
+ message_loop_->PostTask(FROM_HERE,
+ NewRunnableMethod(this, &PipelineImpl::PreloadChangedTask,
+ preload));
+ }
+}
+
base::TimeDelta PipelineImpl::GetCurrentTime() const {
// TODO(scherkus): perhaps replace checking state_ == kEnded with a bool that
// is set/get under the lock, because this is breaching the contract that
@@ -630,7 +644,7 @@ void PipelineImpl::InitializeTask() {
if (state_ == kInitDemuxer) {
set_state(kInitAudioDecoder);
// If this method returns false, then there's no audio stream.
- if (InitializeAudioDecoder(pipeline_init_state_->demuxer_))
+ if (InitializeAudioDecoder(demuxer_))
return;
}
@@ -649,7 +663,7 @@ void PipelineImpl::InitializeTask() {
if (state_ == kInitAudioRenderer) {
// Then perform the stage of initialization, i.e. initialize video decoder.
set_state(kInitVideoDecoder);
- if (InitializeVideoDecoder(pipeline_init_state_->demuxer_))
+ if (InitializeVideoDecoder(demuxer_))
return;
}
@@ -685,6 +699,7 @@ void PipelineImpl::InitializeTask() {
// Initialization was successful, we are now considered paused, so it's safe
// to set the initial playback rate and volume.
+ PreloadChangedTask(GetPreload());
PlaybackRateChangedTask(GetPlaybackRate());
VolumeChangedTask(GetVolume());
@@ -785,6 +800,12 @@ void PipelineImpl::VolumeChangedTask(float volume) {
}
}
+void PipelineImpl::PreloadChangedTask(Preload preload) {
+ DCHECK_EQ(MessageLoop::current(), message_loop_);
+ if (demuxer_)
+ demuxer_->SetPreload(preload);
+}
+
void PipelineImpl::SeekTask(base::TimeDelta time,
PipelineStatusCallback* seek_callback) {
DCHECK_EQ(MessageLoop::current(), message_loop_);
@@ -994,9 +1015,10 @@ void PipelineImpl::FinishDestroyingFiltersTask() {
DCHECK_EQ(MessageLoop::current(), message_loop_);
DCHECK(IsPipelineStopped());
- // Clear renderer references.
+ // Clear filter references.
audio_renderer_ = NULL;
video_renderer_ = NULL;
+ demuxer_ = NULL;
pipeline_filter_ = NULL;
@@ -1057,7 +1079,7 @@ void PipelineImpl::OnDemuxerBuilt(PipelineStatus status, Demuxer* demuxer) {
if (!PrepareFilter(demuxer))
return;
- pipeline_init_state_->demuxer_ = demuxer;
+ demuxer_ = demuxer;
OnFilterInitialize();
}
diff --git a/media/base/pipeline_impl.h b/media/base/pipeline_impl.h
index 41fa234..5dcbcea 100644
--- a/media/base/pipeline_impl.h
+++ b/media/base/pipeline_impl.h
@@ -114,6 +114,7 @@ class PipelineImpl : public Pipeline, public FilterHost {
virtual void SetPlaybackRate(float playback_rate);
virtual float GetVolume() const;
virtual void SetVolume(float volume);
+ virtual void SetPreload(Preload preload);
virtual base::TimeDelta GetCurrentTime() const;
virtual base::TimeDelta GetBufferedTime();
virtual base::TimeDelta GetMediaDuration() const;
@@ -240,6 +241,12 @@ class PipelineImpl : public Pipeline, public FilterHost {
// Carries out notifying filters that the volume has changed.
void VolumeChangedTask(float volume);
+ // Returns media preload value.
+ virtual Preload GetPreload() const;
+
+ // Carries out notifying filters that the preload value has changed.
+ void PreloadChangedTask(Preload preload);
+
// Carries out notifying filters that we are seeking to a new timestamp.
void SeekTask(base::TimeDelta time, PipelineStatusCallback* seek_callback);
@@ -355,6 +362,11 @@ class PipelineImpl : public Pipeline, public FilterHost {
// filters.
float volume_;
+ // Current value of preload attribute. This value is set immediately via
+ // SetPreload() and a task is dispatched on the message loop to notify the
+ // filters.
+ Preload preload_;
+
// Current playback rate (>= 0.0f). This value is set immediately via
// SetPlaybackRate() and a task is dispatched on the message loop to notify
// the filters.
@@ -423,6 +435,9 @@ class PipelineImpl : public Pipeline, public FilterHost {
scoped_refptr<AudioRenderer> audio_renderer_;
scoped_refptr<VideoRenderer> video_renderer_;
+ // Demuxer reference used for setting the preload value.
+ scoped_refptr<Demuxer> demuxer_;
+
// Helper class that stores filter references during pipeline
// initialization.
class PipelineInitState;
diff --git a/media/filters/adaptive_demuxer.cc b/media/filters/adaptive_demuxer.cc
index 0267c11..09a1e67 100644
--- a/media/filters/adaptive_demuxer.cc
+++ b/media/filters/adaptive_demuxer.cc
@@ -229,6 +229,8 @@ void AdaptiveDemuxer::set_host(FilterHost* filter_host) {
if (video && audio != video) video->set_host(filter_host);
}
+void AdaptiveDemuxer::SetPreload(Preload preload) {}
+
scoped_refptr<DemuxerStream> AdaptiveDemuxer::GetStream(
DemuxerStream::Type type) {
switch (type) {
diff --git a/media/filters/adaptive_demuxer.h b/media/filters/adaptive_demuxer.h
index 23cd570..937e01c 100644
--- a/media/filters/adaptive_demuxer.h
+++ b/media/filters/adaptive_demuxer.h
@@ -82,6 +82,7 @@ class AdaptiveDemuxer : public Demuxer {
virtual void Seek(base::TimeDelta time, FilterCallback* callback);
virtual void OnAudioRendererDisabled();
virtual void set_host(FilterHost* filter_host);
+ virtual void SetPreload(Preload preload);
// TODO(fischman): add support for SetPlaybackRate().
// Demuxer implementation.
diff --git a/media/filters/ffmpeg_demuxer.cc b/media/filters/ffmpeg_demuxer.cc
index 15df542..b7d53bc 100644
--- a/media/filters/ffmpeg_demuxer.cc
+++ b/media/filters/ffmpeg_demuxer.cc
@@ -301,6 +301,16 @@ void FFmpegDemuxer::Seek(base::TimeDelta time, FilterCallback* callback) {
NewRunnableMethod(this, &FFmpegDemuxer::SeekTask, time, callback));
}
+void FFmpegDemuxer::SetPlaybackRate(float playback_rate) {
+ DCHECK(data_source_.get());
+ data_source_->SetPlaybackRate(playback_rate);
+}
+
+void FFmpegDemuxer::SetPreload(Preload preload) {
+ DCHECK(data_source_.get());
+ data_source_->SetPreload(preload);
+}
+
void FFmpegDemuxer::OnAudioRendererDisabled() {
message_loop_->PostTask(FROM_HERE,
NewRunnableMethod(this, &FFmpegDemuxer::DisableAudioStreamTask));
diff --git a/media/filters/ffmpeg_demuxer.h b/media/filters/ffmpeg_demuxer.h
index 9dc5800..e65cb34 100644
--- a/media/filters/ffmpeg_demuxer.h
+++ b/media/filters/ffmpeg_demuxer.h
@@ -130,6 +130,8 @@ class FFmpegDemuxer : public Demuxer,
virtual void Seek(base::TimeDelta time, FilterCallback* callback);
virtual void OnAudioRendererDisabled();
virtual void set_host(FilterHost* filter_host);
+ virtual void SetPlaybackRate(float playback_rate);
+ virtual void SetPreload(Preload preload);
// Demuxer implementation.
virtual scoped_refptr<DemuxerStream> GetStream(DemuxerStream::Type type);
diff --git a/media/filters/file_data_source.cc b/media/filters/file_data_source.cc
index 98a434d..da03e98 100644
--- a/media/filters/file_data_source.cc
+++ b/media/filters/file_data_source.cc
@@ -116,4 +116,6 @@ bool FileDataSource::IsStreaming() {
return false;
}
+void FileDataSource::SetPreload(Preload preload) {}
+
} // namespace media
diff --git a/media/filters/file_data_source.h b/media/filters/file_data_source.h
index 0539a36..27e0d0e 100644
--- a/media/filters/file_data_source.h
+++ b/media/filters/file_data_source.h
@@ -32,6 +32,7 @@ class FileDataSource : public DataSource {
ReadCallback* read_callback);
virtual bool GetSize(int64* size_out);
virtual bool IsStreaming();
+ virtual void SetPreload(Preload preload);
private:
// Only allow factories and tests to create this object.