Chromium Code Reviews| Index: media/filters/ffmpeg_demuxer_factory.cc |
| diff --git a/media/filters/ffmpeg_demuxer_factory.cc b/media/filters/ffmpeg_demuxer_factory.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..384a662c459b23ac2c8533ae298041b1003b10fb |
| --- /dev/null |
| +++ b/media/filters/ffmpeg_demuxer_factory.cc |
| @@ -0,0 +1,97 @@ |
| +// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "base/message_loop.h" |
| +#include "media/base/filter_host.h" |
| +#include "media/filters/ffmpeg_demuxer.h" |
| +#include "media/filters/ffmpeg_demuxer_factory.h" |
| + |
| +namespace media { |
| + |
| +FFmpegDemuxerFactory::FFmpegDemuxerFactory( |
| + DataSourceFactory* data_source_factory, |
| + MessageLoop* loop, |
| + FilterHost* host) |
| + : data_source_factory_(data_source_factory), loop_(loop), host_(host) {} |
| + |
| +FFmpegDemuxerFactory::~FFmpegDemuxerFactory() {} |
| + |
| +// This and the next class are one-offs whose raison d'etre is the lack of |
| +// currying functionality in base/callback_old.h's machinery. Once media/ |
| +// PipelineStatusCallback and {DataSource,Demuxer}Factory::BuildCallback are |
| +// migrated to the new base/callback.h machinery these should be removed and |
| +// replaced with currying calls to base::Bind. |
| +class DemuxerCallbackAsPipelineStatusCallback : public PipelineStatusCallback { |
| + public: |
| + DemuxerCallbackAsPipelineStatusCallback( |
| + DemuxerFactory::BuildCallback* cb, |
| + Demuxer* demuxer) |
| + : cb_(cb), demuxer_(demuxer) { |
| + DCHECK(cb_ && demuxer_); |
| + } |
| + |
| + virtual ~DemuxerCallbackAsPipelineStatusCallback() {} |
| + |
| + virtual void RunWithParams(const Tuple1<PipelineError>& params) { |
| + DemuxerFactory::BuildCallback* cb = cb_; |
| + scoped_refptr<Demuxer> demuxer = demuxer_; |
| + cb_ = NULL; |
| + demuxer_ = NULL; |
| + cb->Run(params.a, demuxer); |
| + } |
| + |
| + private: |
| + DemuxerFactory::BuildCallback* cb_; |
|
acolwell GONE FROM CHROMIUM
2011/03/08 21:48:09
Shouldn't this be a scoped_ptr?
Ami GONE FROM CHROMIUM
2011/03/08 22:44:48
Done.
|
| + scoped_refptr<Demuxer> demuxer_; |
| + |
| + DISALLOW_IMPLICIT_CONSTRUCTORS(DemuxerCallbackAsPipelineStatusCallback); |
| +}; |
| + |
| +// See comments on DemuxerCallbackAsPipelineStatusCallback above. |
| +class DemuxerCallbackAsDataSourceCallback : |
| + public DataSourceFactory::BuildCallback { |
| + public: |
| + DemuxerCallbackAsDataSourceCallback(DemuxerFactory::BuildCallback* cb, |
| + MessageLoop* loop, |
| + FilterHost* host) |
| + : cb_(cb), loop_(loop), host_(host) { |
| + DCHECK(cb_ && loop_ && host_); |
| + } |
| + |
| + virtual ~DemuxerCallbackAsDataSourceCallback() {} |
| + |
| + virtual void RunWithParams(const Tuple2<PipelineError, DataSource*>& params) { |
| + DemuxerFactory::BuildCallback* cb = cb_; |
| + cb_ = NULL; |
| + PipelineError status = params.a; |
| + DataSource* data_source = params.b; |
| + if (status != PIPELINE_OK) { |
| + cb->Run(status, static_cast<Demuxer*>(NULL)); |
| + return; |
| + } |
| + DCHECK(data_source); |
| + scoped_refptr<FFmpegDemuxer> demuxer = new FFmpegDemuxer(loop_); |
| + demuxer->Initialize( |
| + data_source, |
| + new DemuxerCallbackAsPipelineStatusCallback(cb, demuxer)); |
| + } |
| + |
| + private: |
| + DemuxerFactory::BuildCallback* cb_; |
| + MessageLoop* loop_; |
| + FilterHost* host_; |
|
acolwell GONE FROM CHROMIUM
2011/03/08 21:48:09
Is this needed? It doesn't look like any of the co
Ami GONE FROM CHROMIUM
2011/03/08 22:44:48
Not anymore.
|
| + |
| + DISALLOW_IMPLICIT_CONSTRUCTORS(DemuxerCallbackAsDataSourceCallback); |
| +}; |
| + |
| +void FFmpegDemuxerFactory::Build(const std::string& url, BuildCallback* cb) { |
| + data_source_factory_->Build( |
| + url, new DemuxerCallbackAsDataSourceCallback(cb, loop_, host_)); |
| +} |
| + |
| +DemuxerFactory* FFmpegDemuxerFactory::Clone() const { |
| + return new FFmpegDemuxerFactory(data_source_factory_->Clone(), loop_, host_); |
| +} |
| + |
| +} // namespace media |