diff options
author | vrk@google.com <vrk@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-12-01 22:44:55 +0000 |
---|---|---|
committer | vrk@google.com <vrk@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-12-01 22:44:55 +0000 |
commit | 62fce1c52d79a0707e6d1d5df3d43296a9b567a6 (patch) | |
tree | 5df8a298a8cbcd2d19fbdad2124de3f5f6a32457 /media/filters | |
parent | 953a616e68ce35e4de10498e5df3445235d7ff52 (diff) | |
download | chromium_src-62fce1c52d79a0707e6d1d5df3d43296a9b567a6.zip chromium_src-62fce1c52d79a0707e6d1d5df3d43296a9b567a6.tar.gz chromium_src-62fce1c52d79a0707e6d1d5df3d43296a9b567a6.tar.bz2 |
Fire CanPlayThrough immediately for local and streaming media files
Changes DownloadRateMonitor logic to know to immediately fire CanPlayThrough
for media files with local sources, including local webcam streams. Renamed
the concept of "loaded" source to "local" source in the media pipeline for
clarity.
Also updated the DownloadRateMonitor logic slightly to lean toward optimism
in firing CanPlayThrough, including firing the event immediately for streaming
media.
BUG=105163
TEST=media_unittests,test_shell_tests, wjia's media stream test page works
Review URL: http://codereview.chromium.org/8661002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@112560 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media/filters')
-rw-r--r-- | media/filters/chunk_demuxer.cc | 10 | ||||
-rw-r--r-- | media/filters/chunk_demuxer.h | 2 | ||||
-rw-r--r-- | media/filters/dummy_demuxer.cc | 15 | ||||
-rw-r--r-- | media/filters/dummy_demuxer.h | 8 | ||||
-rw-r--r-- | media/filters/dummy_demuxer_factory.cc | 11 | ||||
-rw-r--r-- | media/filters/dummy_demuxer_factory.h | 3 | ||||
-rw-r--r-- | media/filters/ffmpeg_demuxer.cc | 11 | ||||
-rw-r--r-- | media/filters/ffmpeg_demuxer.h | 8 | ||||
-rw-r--r-- | media/filters/ffmpeg_demuxer_factory.cc | 10 | ||||
-rw-r--r-- | media/filters/ffmpeg_demuxer_unittest.cc | 6 |
10 files changed, 67 insertions, 17 deletions
diff --git a/media/filters/chunk_demuxer.cc b/media/filters/chunk_demuxer.cc index c27c490..d437d91 100644 --- a/media/filters/chunk_demuxer.cc +++ b/media/filters/chunk_demuxer.cc @@ -369,6 +369,16 @@ int ChunkDemuxer::GetBitrate() { return 0; } +bool ChunkDemuxer::IsLocalSource() { + // TODO(acolwell): Report whether source is local or not. + return false; +} + +bool ChunkDemuxer::IsSeekable() { + // TODO(acolwell): Report whether source is seekable or not. + return true; +} + // Demuxer implementation. scoped_refptr<DemuxerStream> ChunkDemuxer::GetStream( DemuxerStream::Type type) { diff --git a/media/filters/chunk_demuxer.h b/media/filters/chunk_demuxer.h index a940100..b0f0d02 100644 --- a/media/filters/chunk_demuxer.h +++ b/media/filters/chunk_demuxer.h @@ -39,6 +39,8 @@ class MEDIA_EXPORT ChunkDemuxer : public Demuxer { virtual void SetPreload(Preload preload) OVERRIDE; virtual base::TimeDelta GetStartTime() const OVERRIDE; virtual int GetBitrate() OVERRIDE; + virtual bool IsLocalSource() OVERRIDE; + virtual bool IsSeekable() OVERRIDE; // Methods used by an external object to control this demuxer. void FlushData(); diff --git a/media/filters/dummy_demuxer.cc b/media/filters/dummy_demuxer.cc index 095ffee..30e727f 100644 --- a/media/filters/dummy_demuxer.cc +++ b/media/filters/dummy_demuxer.cc @@ -32,9 +32,10 @@ void DummyDemuxerStream::Read(const ReadCallback& read_callback) {} void DummyDemuxerStream::EnableBitstreamConverter() {} -DummyDemuxer::DummyDemuxer(bool has_video, bool has_audio) +DummyDemuxer::DummyDemuxer(bool has_video, bool has_audio, bool local_source) : has_video_(has_video), - has_audio_(has_audio) { + has_audio_(has_audio), + local_source_(local_source) { streams_.resize(DemuxerStream::NUM_TYPES); if (has_audio) streams_[DemuxerStream::AUDIO] = @@ -60,4 +61,14 @@ base::TimeDelta DummyDemuxer::GetStartTime() const { return base::TimeDelta(); } +bool DummyDemuxer::IsLocalSource() { + return local_source_; +} + +bool DummyDemuxer::IsSeekable() { + // This is always false because DummyDemuxer is only used by WebRTC and such + // streams are not seekable. + return false; +} + } // namespace media diff --git a/media/filters/dummy_demuxer.h b/media/filters/dummy_demuxer.h index 309dded..bf371c5 100644 --- a/media/filters/dummy_demuxer.h +++ b/media/filters/dummy_demuxer.h @@ -4,7 +4,8 @@ // Implements the Demuxer interface. DummyDemuxer returns corresponding // DummyDemuxerStream as signal for media pipeline to construct correct -// playback channels. +// playback channels. Used in WebRTC local video capture pipeline, where +// demuxing is not needed. #ifndef MEDIA_FILTERS_DUMMY_DEMUXER_H_ #define MEDIA_FILTERS_DUMMY_DEMUXER_H_ @@ -40,7 +41,7 @@ class DummyDemuxerStream : public DemuxerStream { class DummyDemuxer : public Demuxer { public: - DummyDemuxer(bool has_video, bool has_audio); + DummyDemuxer(bool has_video, bool has_audio, bool local_source); virtual ~DummyDemuxer(); // Demuxer implementation. @@ -49,10 +50,13 @@ class DummyDemuxer : public Demuxer { virtual void SetPreload(Preload preload) OVERRIDE; virtual base::TimeDelta GetStartTime() const OVERRIDE; virtual int GetBitrate() OVERRIDE; + virtual bool IsLocalSource() OVERRIDE; + virtual bool IsSeekable() OVERRIDE; private: bool has_video_; bool has_audio_; + bool local_source_; std::vector< scoped_refptr<DummyDemuxerStream> > streams_; DISALLOW_COPY_AND_ASSIGN(DummyDemuxer); diff --git a/media/filters/dummy_demuxer_factory.cc b/media/filters/dummy_demuxer_factory.cc index 37495e8..735cf59 100644 --- a/media/filters/dummy_demuxer_factory.cc +++ b/media/filters/dummy_demuxer_factory.cc @@ -9,9 +9,12 @@ namespace media { -DummyDemuxerFactory::DummyDemuxerFactory(bool has_video, bool has_audio) +DummyDemuxerFactory::DummyDemuxerFactory(bool has_video, + bool has_audio, + bool local_source) : has_video_(has_video), - has_audio_(has_audio) { + has_audio_(has_audio), + local_source_(local_source) { } DummyDemuxerFactory::~DummyDemuxerFactory() {} @@ -19,12 +22,12 @@ DummyDemuxerFactory::~DummyDemuxerFactory() {} void DummyDemuxerFactory::Build(const std::string& url, const BuildCallback& cb) { scoped_refptr<DummyDemuxer> demuxer = - new DummyDemuxer(has_video_, has_audio_); + new DummyDemuxer(has_video_, has_audio_, local_source_); cb.Run(PIPELINE_OK, demuxer.get()); } DemuxerFactory* DummyDemuxerFactory::Clone() const { - return new DummyDemuxerFactory(has_video_, has_audio_); + return new DummyDemuxerFactory(has_video_, has_audio_, local_source_); } } // namespace media diff --git a/media/filters/dummy_demuxer_factory.h b/media/filters/dummy_demuxer_factory.h index 6662799..0d8a6f7 100644 --- a/media/filters/dummy_demuxer_factory.h +++ b/media/filters/dummy_demuxer_factory.h @@ -14,7 +14,7 @@ namespace media { class MEDIA_EXPORT DummyDemuxerFactory : public DemuxerFactory { public: - DummyDemuxerFactory(bool has_video, bool has_audio); + DummyDemuxerFactory(bool has_video, bool has_audio, bool local_source); virtual ~DummyDemuxerFactory(); // DemuxerFactory methods. @@ -24,6 +24,7 @@ class MEDIA_EXPORT DummyDemuxerFactory : public DemuxerFactory { private: bool has_video_; bool has_audio_; + bool local_source_; DISALLOW_IMPLICIT_CONSTRUCTORS(DummyDemuxerFactory); }; diff --git a/media/filters/ffmpeg_demuxer.cc b/media/filters/ffmpeg_demuxer.cc index 0c63fde..e33bada 100644 --- a/media/filters/ffmpeg_demuxer.cc +++ b/media/filters/ffmpeg_demuxer.cc @@ -277,8 +277,9 @@ base::TimeDelta FFmpegDemuxerStream::ConvertStreamTimestamp( // // FFmpegDemuxer // -FFmpegDemuxer::FFmpegDemuxer(MessageLoop* message_loop) +FFmpegDemuxer::FFmpegDemuxer(MessageLoop* message_loop, bool local_source) : message_loop_(message_loop), + local_source_(local_source), format_context_(NULL), read_event_(false, false), read_has_failed_(false), @@ -571,6 +572,14 @@ int FFmpegDemuxer::GetBitrate() { return 0; } +bool FFmpegDemuxer::IsLocalSource() { + return local_source_; +} + +bool FFmpegDemuxer::IsSeekable() { + return !IsStreaming(); +} + void FFmpegDemuxer::SeekTask(base::TimeDelta time, const FilterStatusCB& cb) { DCHECK_EQ(MessageLoop::current(), message_loop_); diff --git a/media/filters/ffmpeg_demuxer.h b/media/filters/ffmpeg_demuxer.h index 0cff00f..3630481 100644 --- a/media/filters/ffmpeg_demuxer.h +++ b/media/filters/ffmpeg_demuxer.h @@ -128,7 +128,7 @@ class FFmpegDemuxerStream : public DemuxerStream { class MEDIA_EXPORT FFmpegDemuxer : public Demuxer, public FFmpegURLProtocol { public: - explicit FFmpegDemuxer(MessageLoop* message_loop); + FFmpegDemuxer(MessageLoop* message_loop, bool local_source); virtual ~FFmpegDemuxer(); // Posts a task to perform additional demuxing. @@ -148,6 +148,8 @@ class MEDIA_EXPORT FFmpegDemuxer : public Demuxer, public FFmpegURLProtocol { virtual void SetPreload(Preload preload) OVERRIDE; virtual base::TimeDelta GetStartTime() const OVERRIDE; virtual int GetBitrate() OVERRIDE; + virtual bool IsLocalSource() OVERRIDE; + virtual bool IsSeekable() OVERRIDE; // FFmpegURLProtocol implementation. virtual size_t Read(size_t size, uint8* data) OVERRIDE; @@ -208,6 +210,10 @@ class MEDIA_EXPORT FFmpegDemuxer : public Demuxer, public FFmpegURLProtocol { MessageLoop* message_loop_; + // True if the media is a local resource, false if the media require network + // access to be loaded. + bool local_source_; + // FFmpeg context handle. AVFormatContext* format_context_; diff --git a/media/filters/ffmpeg_demuxer_factory.cc b/media/filters/ffmpeg_demuxer_factory.cc index 626cded..dddda76b 100644 --- a/media/filters/ffmpeg_demuxer_factory.cc +++ b/media/filters/ffmpeg_demuxer_factory.cc @@ -4,6 +4,7 @@ #include "base/bind.h" #include "base/message_loop.h" +#include "googleurl/src/gurl.h" #include "media/filters/ffmpeg_demuxer.h" #include "media/filters/ffmpeg_demuxer_factory.h" @@ -28,14 +29,14 @@ static void DemuxerInitDone(const DemuxerFactory::BuildCallback& cb, static void InitializeDemuxerBasedOnDataSourceStatus( const DemuxerFactory::BuildCallback& cb, - MessageLoop* loop, + MessageLoop* loop, bool local_source, PipelineStatus status, DataSource* data_source) { if (status != PIPELINE_OK) { cb.Run(status, NULL); return; } DCHECK(data_source); - scoped_refptr<FFmpegDemuxer> demuxer = new FFmpegDemuxer(loop); + scoped_refptr<FFmpegDemuxer> demuxer = new FFmpegDemuxer(loop, local_source); demuxer->Initialize( data_source, base::Bind(&DemuxerInitDone, cb, demuxer)); @@ -43,9 +44,12 @@ static void InitializeDemuxerBasedOnDataSourceStatus( void FFmpegDemuxerFactory::Build(const std::string& url, const BuildCallback& cb) { + GURL gurl = GURL(url); + bool local_source = !gurl.SchemeIs("http") && !gurl.SchemeIs("https"); data_source_factory_->Build( url, - base::Bind(&InitializeDemuxerBasedOnDataSourceStatus, cb, loop_)); + base::Bind(&InitializeDemuxerBasedOnDataSourceStatus, + cb, loop_, local_source)); } DemuxerFactory* FFmpegDemuxerFactory::Clone() const { diff --git a/media/filters/ffmpeg_demuxer_unittest.cc b/media/filters/ffmpeg_demuxer_unittest.cc index b07b8ac..2c46894 100644 --- a/media/filters/ffmpeg_demuxer_unittest.cc +++ b/media/filters/ffmpeg_demuxer_unittest.cc @@ -42,8 +42,8 @@ class FFmpegDemuxerTest : public testing::Test { protected: FFmpegDemuxerTest() { - // Create an FFmpegDemuxer. - demuxer_ = new FFmpegDemuxer(&message_loop_); + // Create an FFmpegDemuxer with local data source. + demuxer_ = new FFmpegDemuxer(&message_loop_, true); demuxer_->disable_first_seek_hack_for_testing(); // Inject a filter host and message loop and prepare a data source. @@ -508,7 +508,7 @@ TEST_F(FFmpegDemuxerTest, DisableAudioStream) { class MockFFmpegDemuxer : public FFmpegDemuxer { public: explicit MockFFmpegDemuxer(MessageLoop* message_loop) - : FFmpegDemuxer(message_loop) { + : FFmpegDemuxer(message_loop, true) { } virtual ~MockFFmpegDemuxer() {} |