Chromium Code Reviews| Index: media/mojo/services/mojo_renderer_service.cc |
| diff --git a/media/mojo/services/mojo_renderer_service.cc b/media/mojo/services/mojo_renderer_service.cc |
| index d7e43703f0e60a33e42356f05ca8fce8ba2da7b7..0f27f48d25bdb72de7dbdea8550745a620bf15d2 100644 |
| --- a/media/mojo/services/mojo_renderer_service.cc |
| +++ b/media/mojo/services/mojo_renderer_service.cc |
| @@ -12,9 +12,11 @@ |
| #include "media/base/audio_renderer_sink.h" |
| #include "media/base/decryptor.h" |
| #include "media/base/media_log.h" |
| +#include "media/base/serial_runner.h" |
|
xhwang
2014/10/29 00:22:13
not used?
DaleCurtis
2014/10/30 23:16:56
Done.
|
| #include "media/base/video_renderer.h" |
| #include "media/filters/audio_renderer_impl.h" |
| #include "media/filters/renderer_impl.h" |
| +#include "media/filters/video_renderer_impl.h" |
| #include "media/mojo/services/mojo_demuxer_stream_adapter.h" |
| #include "media/mojo/services/renderer_config.h" |
| #include "mojo/application/application_runner_chromium.h" |
| @@ -23,6 +25,9 @@ |
| #include "mojo/public/cpp/application/application_delegate.h" |
| #include "mojo/public/cpp/application/interface_factory_impl.h" |
| +// TODO(dalecurtis): Put this in renderer config. |
| +#include "media/filters/ffmpeg_video_decoder.h" |
| + |
| namespace media { |
| // Time interval to update media time. |
| @@ -33,26 +38,71 @@ static void LogMediaSourceError(const scoped_refptr<MediaLog>& media_log, |
| media_log->AddEvent(media_log->CreateMediaSourceErrorEvent(error)); |
| } |
| +static void PaintNothingDropEverything(const scoped_refptr<VideoFrame>& frame) { |
|
xhwang
2014/10/29 00:22:13
PaintNothing == DropEverything ? Pick one of them?
DaleCurtis
2014/10/30 23:16:56
Done.
|
| +} |
| + |
| // Shim DemuxerStreamProvider wrapper for a single DemuxerStream. |
| // TODO(dalecurtis): Once we support more than one DemuxerStream we'll need a |
| // more complicated shim which can handle a mojo::Array<DemuxerStream>. |
| +// TODO(dalecurtis): This should probably be in its own file now. |
| class DemuxerStreamProviderShim : public DemuxerStreamProvider { |
| public: |
| - DemuxerStreamProviderShim(scoped_ptr<MojoDemuxerStreamAdapter> stream) |
| - : stream_(stream.Pass()) {} |
| + DemuxerStreamProviderShim(mojo::DemuxerStreamPtr audio, |
| + mojo::DemuxerStreamPtr video, |
| + const base::Closure& demuxer_ready_cb) |
| + : demuxer_ready_cb_(demuxer_ready_cb), |
| + streams_ready_(0), |
| + weak_factory_(this) { |
| + DCHECK(audio || video); |
| + DCHECK(!demuxer_ready_cb_.is_null()); |
| + |
| + if (audio) { |
| + streams_.push_back(new MojoDemuxerStreamAdapter( |
| + audio.Pass(), |
| + base::Bind(&DemuxerStreamProviderShim::OnStreamReady, |
| + weak_factory_.GetWeakPtr()), |
| + DemuxerStream::AUDIO)); |
| + } |
| + |
| + if (video) { |
| + streams_.push_back(new MojoDemuxerStreamAdapter( |
| + video.Pass(), |
| + base::Bind(&DemuxerStreamProviderShim::OnStreamReady, |
| + weak_factory_.GetWeakPtr()), |
| + DemuxerStream::VIDEO)); |
| + } |
|
xhwang
2014/10/29 00:22:13
see above comments
DaleCurtis
2014/10/30 23:16:56
Moved out.
|
| + } |
| ~DemuxerStreamProviderShim() override {} |
| DemuxerStream* GetStream(DemuxerStream::Type type) override { |
| - return type != stream_->type() ? nullptr : stream_.get(); |
| - }; |
| + DCHECK(demuxer_ready_cb_.is_null()); |
| + for (auto* stream : streams_) { |
| + if (stream->type() == type) |
| + return stream; |
| + } |
| + |
| + return nullptr; |
| + } |
| Liveness GetLiveness() const override { |
| + // TODO(dalecurtis): What to do here?? Probably we need an API for this. |
|
xhwang
2014/10/29 00:22:13
See https://code.google.com/p/chromium/issues/deta
DaleCurtis
2014/10/30 23:16:57
Acknowledged.
|
| return DemuxerStreamProvider::LIVENESS_UNKNOWN; |
| } |
| private: |
| - scoped_ptr<MojoDemuxerStreamAdapter> stream_; |
| + void OnStreamReady() { |
| + if (++streams_ready_ == streams_.size()) { |
|
xhwang
2014/10/29 00:22:13
I like this!
|
| + demuxer_ready_cb_.Run(); |
| + demuxer_ready_cb_.Reset(); |
|
xhwang
2014/10/29 00:22:13
base::ResetAndReturn(&demuxer_ready_cb).Run()?
DaleCurtis
2014/10/30 23:16:56
Done.
|
| + } |
| + } |
| + |
| + base::Closure demuxer_ready_cb_; |
| + ScopedVector<MojoDemuxerStreamAdapter> streams_; |
| + size_t streams_ready_; |
| + |
| + base::WeakPtrFactory<DemuxerStreamProviderShim> weak_factory_; |
| DISALLOW_COPY_AND_ASSIGN(DemuxerStreamProviderShim); |
| }; |
| @@ -101,7 +151,19 @@ MojoRendererService::MojoRendererService( |
| SetDecryptorReadyCB(), |
| renderer_config->GetAudioHardwareConfig(), |
| media_log)); |
| - scoped_ptr<VideoRenderer> video_renderer(nullptr); |
| + |
| + |
| + // Create our video decoders and renderer. |
| + ScopedVector<VideoDecoder> video_decoders; |
| + video_decoders.push_back(new FFmpegVideoDecoder(task_runner)); |
| + |
| + scoped_ptr<VideoRenderer> video_renderer( |
| + new VideoRendererImpl(task_runner, |
| + video_decoders.Pass(), |
| + SetDecryptorReadyCB(), |
| + base::Bind(&PaintNothingDropEverything), |
| + true, |
| + media_log)); |
| // Create renderer. |
| renderer_.reset(new RendererImpl( |
| @@ -120,11 +182,9 @@ void MojoRendererService::Initialize(mojo::DemuxerStreamPtr audio, |
| state_ = STATE_INITIALIZING; |
| stream_provider_.reset(new DemuxerStreamProviderShim( |
| - make_scoped_ptr(new MojoDemuxerStreamAdapter( |
| - audio.Pass(), |
| - base::Bind(&MojoRendererService::OnStreamReady, |
| - weak_this_, |
| - callback))).Pass())); |
| + audio.Pass(), |
| + video.Pass(), |
| + base::Bind(&MojoRendererService::OnStreamReady, weak_this_, callback))); |
| } |
| void MojoRendererService::Flush(const mojo::Closure& callback) { |