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) { |