diff options
-rw-r--r-- | media/base/demuxer.h | 9 | ||||
-rw-r--r-- | media/base/mock_filters.cc | 23 | ||||
-rw-r--r-- | media/base/mock_filters.h | 37 | ||||
-rw-r--r-- | media/base/pipeline.cc | 10 | ||||
-rw-r--r-- | media/base/pipeline.h | 8 | ||||
-rw-r--r-- | media/base/pipeline_unittest.cc | 24 | ||||
-rw-r--r-- | media/filters/chunk_demuxer.cc | 9 | ||||
-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 | 5 | ||||
-rw-r--r-- | media/filters/ffmpeg_demuxer.cc | 12 | ||||
-rw-r--r-- | media/filters/ffmpeg_demuxer.h | 9 | ||||
-rw-r--r-- | media/filters/ffmpeg_demuxer_unittest.cc | 2 | ||||
-rw-r--r-- | media/filters/pipeline_integration_test_base.cc | 3 | ||||
-rw-r--r-- | media/tools/player_wtl/movie.cc | 3 | ||||
-rw-r--r-- | media/tools/player_x11/player_x11.cc | 3 | ||||
-rw-r--r-- | media/tools/seek_tester/seek_tester.cc | 2 | ||||
-rw-r--r-- | webkit/media/filter_helpers.cc | 12 | ||||
-rw-r--r-- | webkit/media/filter_helpers.h | 6 | ||||
-rw-r--r-- | webkit/media/webmediaplayer_impl.cc | 23 | ||||
-rw-r--r-- | webkit/media/webmediaplayer_impl.h | 2 |
21 files changed, 196 insertions, 23 deletions
diff --git a/media/base/demuxer.h b/media/base/demuxer.h index a8cf50b..1e913d4 100644 --- a/media/base/demuxer.h +++ b/media/base/demuxer.h @@ -70,6 +70,15 @@ class MEDIA_EXPORT Demuxer : public base::RefCountedThreadSafe<Demuxer> { // approximated. Returns 0 if it is unknown. virtual int GetBitrate() = 0; + // Returns true if the source is from a local file or stream (such as a + // webcam stream), false otherwise. + // + // TODO(scherkus): See http://crbug.com/120426 on why we should remove this. + virtual bool IsLocalSource() = 0; + + // Returns true if seeking is possible; false otherwise. + virtual bool IsSeekable() = 0; + protected: friend class base::RefCountedThreadSafe<Demuxer>; virtual ~Demuxer(); diff --git a/media/base/mock_filters.cc b/media/base/mock_filters.cc index a5977a4..00347cd 100644 --- a/media/base/mock_filters.cc +++ b/media/base/mock_filters.cc @@ -15,6 +15,29 @@ using ::testing::Return; namespace media { +MockDataSource::MockDataSource() + : total_bytes_(-1), + buffered_bytes_(-1) { +} + +MockDataSource::~MockDataSource() {} + +void MockDataSource::set_host(DataSourceHost* data_source_host) { + DataSource::set_host(data_source_host); + + if (total_bytes_ > 0) + host()->SetTotalBytes(total_bytes_); + + if (buffered_bytes_ > 0) + host()->SetBufferedBytes(buffered_bytes_); +} + +void MockDataSource::SetTotalAndBufferedBytes(int64 total_bytes, + int64 buffered_bytes) { + total_bytes_ = total_bytes; + buffered_bytes_ = buffered_bytes; +} + MockDemuxer::MockDemuxer() {} MockDemuxer::~MockDemuxer() {} diff --git a/media/base/mock_filters.h b/media/base/mock_filters.h index 32b2333..a5060d3 100644 --- a/media/base/mock_filters.h +++ b/media/base/mock_filters.h @@ -3,7 +3,8 @@ // found in the LICENSE file. // // A new breed of mock media filters, this time using gmock! Feel free to add -// actions if you need interesting side-effects. +// actions if you need interesting side-effects (i.e., copying data to the +// buffer passed into MockDataSource::Read()). // // Don't forget you can use StrictMock<> and NiceMock<> if you want the mock // filters to fail the test or do nothing when an unexpected method is called. @@ -69,6 +70,38 @@ class MockFilter : public Filter { DISALLOW_COPY_AND_ASSIGN(MockFilter); }; +class MockDataSource : public DataSource { + public: + MockDataSource(); + + virtual void set_host(DataSourceHost* data_source_host); + + MOCK_METHOD1(Stop, void(const base::Closure& callback)); + MOCK_METHOD1(SetPlaybackRate, void(float playback_rate)); + MOCK_METHOD2(Seek, void(base::TimeDelta time, const PipelineStatusCB& cb)); + MOCK_METHOD0(OnAudioRendererDisabled, void()); + + // DataSource implementation. + MOCK_METHOD4(Read, void(int64 position, int size, uint8* data, + const DataSource::ReadCB& callback)); + MOCK_METHOD1(GetSize, bool(int64* size_out)); + MOCK_METHOD1(SetBitrate, void(int bitrate)); + MOCK_METHOD0(IsStreaming, bool()); + + // Sets the TotalBytes & BufferedBytes values to be sent to host() when + // the set_host() is called. + void SetTotalAndBufferedBytes(int64 total_bytes, int64 buffered_bytes); + + protected: + virtual ~MockDataSource(); + + private: + int64 total_bytes_; + int64 buffered_bytes_; + + DISALLOW_COPY_AND_ASSIGN(MockDataSource); +}; + class MockDemuxer : public Demuxer { public: MockDemuxer(); @@ -82,6 +115,8 @@ class MockDemuxer : public Demuxer { MOCK_METHOD1(GetStream, scoped_refptr<DemuxerStream>(DemuxerStream::Type)); MOCK_CONST_METHOD0(GetStartTime, base::TimeDelta()); MOCK_METHOD0(GetBitrate, int()); + MOCK_METHOD0(IsLocalSource, bool()); + MOCK_METHOD0(IsSeekable, bool()); protected: virtual ~MockDemuxer(); diff --git a/media/base/pipeline.cc b/media/base/pipeline.cc index 623cecf..260f04d 100644 --- a/media/base/pipeline.cc +++ b/media/base/pipeline.cc @@ -223,6 +223,16 @@ void Pipeline::GetNaturalVideoSize(gfx::Size* out_size) const { *out_size = natural_size_; } +bool Pipeline::IsStreaming() const { + base::AutoLock auto_lock(lock_); + return demuxer_ && !demuxer_->IsSeekable(); +} + +bool Pipeline::IsLocalSource() const { + base::AutoLock auto_lock(lock_); + return demuxer_ && demuxer_->IsLocalSource(); +} + PipelineStatistics Pipeline::GetStatistics() const { base::AutoLock auto_lock(lock_); return statistics_; diff --git a/media/base/pipeline.h b/media/base/pipeline.h index 73359c2..699b5e2 100644 --- a/media/base/pipeline.h +++ b/media/base/pipeline.h @@ -230,6 +230,14 @@ class MEDIA_EXPORT Pipeline // be 0. void GetNaturalVideoSize(gfx::Size* out_size) const; + // If this method returns true, that means the data source is a streaming + // data source. Seeking may not be possible. + bool IsStreaming() const; + + // If this method returns true, that means the data source is local and + // the network is not needed. + bool IsLocalSource() const; + // Gets the current pipeline statistics. PipelineStatistics GetStatistics() const; diff --git a/media/base/pipeline_unittest.cc b/media/base/pipeline_unittest.cc index 888b962..56d39ff 100644 --- a/media/base/pipeline_unittest.cc +++ b/media/base/pipeline_unittest.cc @@ -36,6 +36,8 @@ namespace media { static const int kTotalBytes = 1024; static const int kBufferedBytes = 1024; static const int kBitrate = 1234; +static const bool kLocalSource = false; +static const bool kSeekable = true; ACTION_P(InitializeDemuxerWithError, error) { arg1.Run(error); @@ -115,6 +117,10 @@ class PipelineTest : public ::testing::Test { // Demuxer properties. EXPECT_CALL(*mocks_->demuxer(), GetBitrate()) .WillRepeatedly(Return(kBitrate)); + EXPECT_CALL(*mocks_->demuxer(), IsLocalSource()) + .WillRepeatedly(Return(kLocalSource)); + EXPECT_CALL(*mocks_->demuxer(), IsSeekable()) + .WillRepeatedly(Return(kSeekable)); // Configure the demuxer to return the streams. for (size_t i = 0; i < streams->size(); ++i) { @@ -794,6 +800,24 @@ TEST_F(PipelineTest, StartTimeIsNonZero) { EXPECT_EQ(kStartTime, pipeline_->GetCurrentTime()); } +TEST_F(PipelineTest, DemuxerProperties) { + CreateAudioStream(); + CreateVideoStream(); + MockDemuxerStreamVector streams; + streams.push_back(audio_stream()); + streams.push_back(video_stream()); + + InitializeDemuxer(&streams); + InitializeAudioDecoder(audio_stream()); + InitializeAudioRenderer(); + InitializeVideoDecoder(video_stream()); + InitializeVideoRenderer(); + InitializePipeline(PIPELINE_OK); + + EXPECT_EQ(kLocalSource, pipeline_->IsLocalSource()); + EXPECT_NE(kSeekable, pipeline_->IsStreaming()); +} + class FlexibleCallbackRunner : public base::DelegateSimpleThread::Delegate { public: FlexibleCallbackRunner(base::TimeDelta delay, PipelineStatus status, diff --git a/media/filters/chunk_demuxer.cc b/media/filters/chunk_demuxer.cc index fdd1a97..a753c18 100644 --- a/media/filters/chunk_demuxer.cc +++ b/media/filters/chunk_demuxer.cc @@ -474,6 +474,15 @@ int ChunkDemuxer::GetBitrate() { return 0; } +bool ChunkDemuxer::IsLocalSource() { + // TODO(acolwell): Report whether source is local or not. + return false; +} + +bool ChunkDemuxer::IsSeekable() { + return duration_ != kInfiniteDuration(); +} + // 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 8c5dd0b..eb132f5 100644 --- a/media/filters/chunk_demuxer.h +++ b/media/filters/chunk_demuxer.h @@ -46,6 +46,8 @@ class MEDIA_EXPORT ChunkDemuxer : public Demuxer { DemuxerStream::Type type) 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 1b3b369..30b0408 100644 --- a/media/filters/dummy_demuxer.cc +++ b/media/filters/dummy_demuxer.cc @@ -32,9 +32,10 @@ void DummyDemuxerStream::Read(const ReadCB& read_cb) {} 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] = @@ -64,4 +65,14 @@ int DummyDemuxer::GetBitrate() { return 0; } +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 e62c117..4cb72fc 100644 --- a/media/filters/dummy_demuxer.h +++ b/media/filters/dummy_demuxer.h @@ -41,7 +41,7 @@ class DummyDemuxerStream : public DemuxerStream { class MEDIA_EXPORT 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. @@ -51,10 +51,13 @@ class MEDIA_EXPORT DummyDemuxer : public Demuxer { DemuxerStream::Type type) 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/ffmpeg_demuxer.cc b/media/filters/ffmpeg_demuxer.cc index fd688d0..3953c60 100644 --- a/media/filters/ffmpeg_demuxer.cc +++ b/media/filters/ffmpeg_demuxer.cc @@ -278,9 +278,11 @@ base::TimeDelta FFmpegDemuxerStream::ConvertStreamTimestamp( // FFmpegDemuxer::FFmpegDemuxer( MessageLoop* message_loop, - const scoped_refptr<DataSource>& data_source) + const scoped_refptr<DataSource>& data_source, + bool local_source) : host_(NULL), message_loop_(message_loop), + local_source_(local_source), format_context_(NULL), data_source_(data_source), read_event_(false, false), @@ -590,6 +592,14 @@ int FFmpegDemuxer::GetBitrate() { return bitrate_; } +bool FFmpegDemuxer::IsLocalSource() { + return local_source_; +} + +bool FFmpegDemuxer::IsSeekable() { + return !IsStreaming(); +} + void FFmpegDemuxer::SeekTask(base::TimeDelta time, const PipelineStatusCB& cb) { DCHECK_EQ(MessageLoop::current(), message_loop_); diff --git a/media/filters/ffmpeg_demuxer.h b/media/filters/ffmpeg_demuxer.h index 6fa0bd6..02f8019 100644 --- a/media/filters/ffmpeg_demuxer.h +++ b/media/filters/ffmpeg_demuxer.h @@ -131,7 +131,8 @@ class FFmpegDemuxerStream : public DemuxerStream { class MEDIA_EXPORT FFmpegDemuxer : public Demuxer, public FFmpegURLProtocol { public: FFmpegDemuxer(MessageLoop* message_loop, - const scoped_refptr<DataSource>& data_source); + const scoped_refptr<DataSource>& data_source, + bool local_source); virtual ~FFmpegDemuxer(); // Posts a task to perform additional demuxing. @@ -148,6 +149,8 @@ class MEDIA_EXPORT FFmpegDemuxer : public Demuxer, public FFmpegURLProtocol { DemuxerStream::Type type) 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; @@ -201,6 +204,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_unittest.cc b/media/filters/ffmpeg_demuxer_unittest.cc index 0ec2bb0..f8a8888 100644 --- a/media/filters/ffmpeg_demuxer_unittest.cc +++ b/media/filters/ffmpeg_demuxer_unittest.cc @@ -69,7 +69,7 @@ class FFmpegDemuxerTest : public testing::Test { .WillRepeatedly(SaveArg<0>(¤t_read_position_)); CreateDataSource(name, disable_file_size); - demuxer_ = new FFmpegDemuxer(&message_loop_, data_source_); + demuxer_ = new FFmpegDemuxer(&message_loop_, data_source_, true); } MOCK_METHOD1(CheckPoint, void(int v)); diff --git a/media/filters/pipeline_integration_test_base.cc b/media/filters/pipeline_integration_test_base.cc index 190fe2e..4d65887 100644 --- a/media/filters/pipeline_integration_test_base.cc +++ b/media/filters/pipeline_integration_test_base.cc @@ -147,7 +147,8 @@ scoped_ptr<FilterCollection> PipelineIntegrationTestBase::CreateFilterCollection(const std::string& url) { scoped_refptr<FileDataSource> data_source = new FileDataSource(); CHECK_EQ(PIPELINE_OK, data_source->Initialize(url)); - return CreateFilterCollection(new FFmpegDemuxer(&message_loop_, data_source)); + return CreateFilterCollection(new FFmpegDemuxer( + &message_loop_, data_source, false)); } scoped_ptr<FilterCollection> diff --git a/media/tools/player_wtl/movie.cc b/media/tools/player_wtl/movie.cc index 3473aff..310a5b1 100644 --- a/media/tools/player_wtl/movie.cc +++ b/media/tools/player_wtl/movie.cc @@ -72,7 +72,8 @@ bool Movie::Open(const wchar_t* url, VideoRendererBase* video_renderer) { // Create filter collection. scoped_ptr<FilterCollection> collection(new FilterCollection()); - collection->SetDemuxer(new FFmpegDemuxer(pipeline_loop, data_source)); + collection->SetDemuxer(new FFmpegDemuxer( + pipeline_loop, data_source, true)); collection->AddAudioDecoder(new FFmpegAudioDecoder( base::Bind(&MessageLoopFactory::GetMessageLoop, base::Unretained(message_loop_factory_.get()), diff --git a/media/tools/player_x11/player_x11.cc b/media/tools/player_x11/player_x11.cc index 68fe80c..6b028e5 100644 --- a/media/tools/player_x11/player_x11.cc +++ b/media/tools/player_x11/player_x11.cc @@ -110,7 +110,8 @@ bool InitPipeline(MessageLoop* message_loop, // Create our filter factories. scoped_ptr<media::FilterCollection> collection( new media::FilterCollection()); - collection->SetDemuxer(new media::FFmpegDemuxer(message_loop, data_source)); + collection->SetDemuxer(new media::FFmpegDemuxer( + message_loop, data_source, true)); collection->AddAudioDecoder(new media::FFmpegAudioDecoder( base::Bind(&media::MessageLoopFactory::GetMessageLoop, base::Unretained(message_loop_factory), diff --git a/media/tools/seek_tester/seek_tester.cc b/media/tools/seek_tester/seek_tester.cc index b14628c..65046ef 100644 --- a/media/tools/seek_tester/seek_tester.cc +++ b/media/tools/seek_tester/seek_tester.cc @@ -65,7 +65,7 @@ int main(int argc, char** argv) { MessageLoop loop; media::PipelineStatusCB quitter = base::Bind(&QuitMessageLoop, &loop); scoped_refptr<media::FFmpegDemuxer> demuxer( - new media::FFmpegDemuxer(&loop, file_data_source)); + new media::FFmpegDemuxer(&loop, file_data_source, true)); demuxer->Initialize(&host, quitter); loop.Run(); diff --git a/webkit/media/filter_helpers.cc b/webkit/media/filter_helpers.cc index f304fb3..d1499a5 100644 --- a/webkit/media/filter_helpers.cc +++ b/webkit/media/filter_helpers.cc @@ -56,7 +56,13 @@ bool BuildMediaStreamCollection(const WebKit::WebURL& url, filter_collection->AddVideoDecoder(video_decoder); - filter_collection->SetDemuxer(new media::DummyDemuxer(true, false)); + // TODO(vrk/wjia): Setting true for local_source is under the assumption + // that the MediaStream represents a local webcam. This will need to + // change in the future when GetVideoDecoder is no longer hardcoded to + // only return CaptureVideoDecoders. + // + // See http://crbug.com/120426 for details. + filter_collection->SetDemuxer(new media::DummyDemuxer(true, false, true)); return true; } @@ -80,12 +86,14 @@ bool BuildMediaSourceCollection( void BuildDefaultCollection( const scoped_refptr<media::DataSource>& data_source, + bool local_source, media::MessageLoopFactory* message_loop_factory, media::FilterCollection* filter_collection, scoped_refptr<media::FFmpegVideoDecoder>* video_decoder) { filter_collection->SetDemuxer(new media::FFmpegDemuxer( message_loop_factory->GetMessageLoop("PipelineThread"), - data_source)); + data_source, + local_source)); AddDefaultDecodersToCollection(message_loop_factory, filter_collection, video_decoder); diff --git a/webkit/media/filter_helpers.h b/webkit/media/filter_helpers.h index 771251a..cdea330 100644 --- a/webkit/media/filter_helpers.h +++ b/webkit/media/filter_helpers.h @@ -47,8 +47,14 @@ bool BuildMediaSourceCollection( // Builds the required filters for handling regular URLs and adds them to // |filter_collection| and fills |video_decoder| returning true if successful. +// +// |local_source| refers to whether the data being fetched requires network +// access. +// +// TODO(scherkus): a data source should be able to tell us this. void BuildDefaultCollection( const scoped_refptr<media::DataSource>& data_source, + bool local_source, media::MessageLoopFactory* message_loop_factory, media::FilterCollection* filter_collection, scoped_refptr<media::FFmpegVideoDecoder>* video_decoder); diff --git a/webkit/media/webmediaplayer_impl.cc b/webkit/media/webmediaplayer_impl.cc index aed2dbd..e67a359 100644 --- a/webkit/media/webmediaplayer_impl.cc +++ b/webkit/media/webmediaplayer_impl.cc @@ -109,8 +109,7 @@ WebMediaPlayerImpl::WebMediaPlayerImpl( media_log_(media_log), accelerated_compositing_reported_(false), incremented_externally_allocated_memory_(false), - audio_source_provider_(audio_source_provider), - is_local_source_(false) { + audio_source_provider_(audio_source_provider) { media_log_->AddEvent( media_log_->CreateEvent(media::MediaLogEvent::WEBMEDIAPLAYER_CREATED)); @@ -236,9 +235,12 @@ void WebMediaPlayerImpl::load(const WebKit::WebURL& url) { &WebMediaPlayerImpl::DataSourceInitialized, base::Unretained(this), gurl)); - is_local_source_ = !gurl.SchemeIs("http") && !gurl.SchemeIs("https"); + // TODO(scherkus): this is leftover from removing DemuxerFactory -- instead + // our DataSource should report this information. See http://crbug.com/120426 + bool local_source = !gurl.SchemeIs("http") && !gurl.SchemeIs("https"); BuildDefaultCollection(proxy_->data_source(), + local_source, message_loop_factory_.get(), filter_collection_.get(), &video_decoder); @@ -464,8 +466,11 @@ const WebKit::WebTimeRanges& WebMediaPlayerImpl::buffered() { float WebMediaPlayerImpl::maxTimeSeekable() const { DCHECK_EQ(main_loop_, MessageLoop::current()); - // We don't support seeking in streaming media. - if (proxy_->data_source()->IsStreaming()) + // If we are performing streaming, we report that we cannot seek at all. + // We are using this flag to indicate if the data source supports seeking + // or not. We should be able to seek even if we are performing streaming. + // TODO(hclam): We need to update this when we have better caching. + if (pipeline_->IsStreaming()) return 0.0f; return static_cast<float>(pipeline_->GetMediaDuration().InSecondsF()); } @@ -513,8 +518,10 @@ bool WebMediaPlayerImpl::hasSingleSecurityOrigin() const { WebMediaPlayer::MovieLoadType WebMediaPlayerImpl::movieLoadType() const { DCHECK_EQ(main_loop_, MessageLoop::current()); - // Disable seeking while streaming. - if (proxy_->data_source()->IsStreaming()) + // TODO(hclam): If the pipeline is performing streaming, we say that this is + // a live stream. But instead it should be a StoredStream if we have proper + // caching. + if (pipeline_->IsStreaming()) return WebMediaPlayer::MovieLoadTypeLiveStream; return WebMediaPlayer::MovieLoadTypeUnknown; } @@ -803,7 +810,7 @@ void WebMediaPlayerImpl::OnPipelineInitialize(PipelineStatus status) { if (!hasVideo()) GetClient()->disableAcceleratedCompositing(); - if (is_local_source_) + if (pipeline_->IsLocalSource()) SetNetworkState(WebMediaPlayer::NetworkStateLoaded); SetReadyState(WebMediaPlayer::ReadyStateHaveMetadata); diff --git a/webkit/media/webmediaplayer_impl.h b/webkit/media/webmediaplayer_impl.h index b5c615f..272b103 100644 --- a/webkit/media/webmediaplayer_impl.h +++ b/webkit/media/webmediaplayer_impl.h @@ -316,8 +316,6 @@ class WebMediaPlayerImpl WebKit::WebAudioSourceProvider* audio_source_provider_; - bool is_local_source_; - DISALLOW_COPY_AND_ASSIGN(WebMediaPlayerImpl); }; |